COBOLプログラムのコメントを外します!


64

COBOLは非常に古い言語であり、執筆時点では58歳です。実際、非常に古いため、非常に興味深い癖があります。各行の最初の6文字はコメントです。

これはなぜですか?まあ、これらの6文字は、プログラムが完全にデジタル化されておらず、コンピューターに入力されていなかった当時、行番号として使用されることを目的としていました。

さらに、7番目の文字は非常に小さなセットの一部にしかならない可能性があります(通常*、行またはスペースをコメントアウトして、コードから行番号を分離します)

しかし、よりデジタルシステムを使用していて、生のプログラムだけが必要な場合はどうでしょうか。

コメントシステム

COBOLには2種類のコメントがあります。行コメントと前述の「行番号」コメントです。

行番号のコメントを外すのは簡単です。各行から最初の7文字(6プラス1スペース)を削除するだけです。

000000 apple
000001 banana
celery donuts

になるだろう:

apple
banana
donuts

行コメントはそれを少し難しくします。行コメントは*、次のように、行の7番目の文字位置にアスタリスクを配置して開始されます。

000323* this is a comment

これは行コメントではありません:

*00000 this isn't a comment

行コメントのコメントを解除するには、行全体を削除します。

「プログラム」とコメントされた例:

000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges

コメントなしのバージョン:

blah blah
oranges?
love me some oranges

つまり、文字列のコメントを解除するには、各行の最初の6文字を削除してから、スターで始まらないすべての行の最初の文字を除くすべてを返します。

挑戦

コメント化されたプログラムを受け取り、コメント化されていないバリアントを返すプログラムまたは関数を作成します。

明確化

  • アスタリスク(*)は、行の最初の7文字以外の場所では検出されません(構文の確認を求めているわけではありません)
  • 各行には常に少なくとも7文字が含まれます。
  • 7番目の文字は常にアスタリスクまたはスペースであると想定できます。
  • 入力または出力は、マトリックスまたはリストです。
  • 印刷可能なASCII文字(および改行)のみを処理する必要があります。
  • 末尾に改行を付けて出力できます。また、必要に応じて、入力の末尾に改行があると想定することもできます。

得点

これは、バイト数が最小の答えが勝ちです!

免責事項:私は実際にCOBOLを知らず、主張もしていません。この質問で私が行ったCOBOLに関する主張のいずれかに誤りがある場合、私は責任を負いません。


23
行番号はコメントではありません。それらは列です。用語をお願いします。
user207421

1
すべての例には、*。の後にスペースがあります。これは偶然ですか?
ニール

6
Oldは自動的に悪いことを意味するわけではありません。私はアジャイルCOBOLショップで働いてきました。JavaではできなかったAS / 400でできることがありました。
トールビョーンラヴンアンデルセン

1
へえ...私は実際に、フィールドがパックされていない場合にのみ機能するCOBOL CopyBookパーサーを作成しました。それをJSONに変換するだけkey:{key:{key:length,key:length}}です。ただし、すべての書式設定データと入力データを削除します。
魔法のタコUr

4
最初の6文字にスペースを入れることはできますか?

回答:


104

COBOL(GnuCOBOL)、191 + 17 = 208バイト

私はこの答えについてCOBOLを「学習」したので、おそらく完全にゴルフではありません。

これは完全なプログラムであり、標準入力と思われるものを入力し、標準出力と思われるものに書き込みます。おそらくいつかこれに戻り、(1)COBOLに関数があるかどうかを判断し、ある場合は、(2)関数ソリューションが短くなるかどうかを確認します。

バイトカウントには、プログラムおよびコンパイラフラグ(-freeおよび-frelax-syntax)が含まれます。

program-id.c.select i assign keyboard line sequential.fd i. 1 l pic X(80). 88 e value 0.open input i perform until e read i end set e to true end-read if not e and l(7:1)<>'*'display l(8:73).

オンラインで試す

ゴルフされていないプログラム

program-id. c.

select i assign to keyboard organization line sequential.

fd i.
    1 l pic X(80).
    88 e value 0.

open input i
perform until e
    read i
        end set e to true
    end-read
    if not e and l(7:1) <> '*'
        display l(8:73).

制限事項

技術的に言えば、出力は正しくありません。私の大まかな研究から、COBOLで文字列を格納する唯一の実用的な方法は、固定サイズのバッファにあるようです。これは固定形式プログラムの行の長さの制限であるため、80文字のバッファーサイズを選択しました。これには2つの制限があります。

  • 80文字より長い行は切り捨てられます。
  • 80文字より短い行には、スペースが右詰めされます。

まあ、それはCOBOLなので、これは受け入れられると思います。そうでない場合は、代替案を検討したいと思います。

謝辞

  • Edward Hのおかげで-166バイト
  • -hornjのおかげで2バイト

10
アスタリスク(*)ライン上の最初の7つの文字以外の場所を見つけることはありません ...まだ...;)
・クール

@Cœurハハはい...しかし、私の解決策はその仮定を使用しないので、多分それは適切です!
ヤコブ

8
1つのインターネットに勝ちます。
ジョシュア

COMPUTEステートメントを除き、@Cœur。
ClickRick

1
ゴールドバッジおめでとうございます!
コイナーリンガーをケア

20

パイソン239の 38 37バイト

LyricLyのおかげで-1バイト。Megoのおかげで-1バイト。

lambda s:[i[7:]for i in s if'*'>i[6]]

オンラインでお試しください!

文字列のリストとしてのI / O。


2
スペースのコードポイントはアスタリスクのコードポイントよりも低く、7番目の文字は常にスペースまたはアスタリスクになるため、と置き換え!=てバイトを保存し<ます。
-LyricLy

だから、7番目の文字は常にスペースまたはアスタリスクになりますか?
完全に人間

はい。You may assume the seventh character is always an asterisk or a space.
LyricLy

1
で1つのバイトを保存if'*'!=i[6]
MEGO


11

V13 11 10バイト

Î6x<<
çª/d

オンラインでお試しください!

説明

Î       ' On every line
  x     ' delete the first...
 6      ' 6 characters
   <<   ' and unindent the line (removes the leading space)
ç /     ' on every line
 ª      ' matching \*
   d    ' delete the line

Hexdump:

00000000: ce36 783c 3c0a e7aa 2f64                 .6x<<.../d

7x代わりにできません6x<<か?
DJMcMayhem

1
その後、削除します*
nmjcman101

*最初にlinsを削除してから実行しÎ7xますか?(*は文字0〜5に
含める

@ 12431234123412341234123残念ながらいいえ*。最初の6文字にaが含まれている可能性があるためです。
nmjcman101

9

Paradoc(v0.2.8 +)、8バイト(CP-1252)

µ6>(7#;x

行のリストを取得し、コメント化されていない行のリストを作成します。

説明:

μ        .. Map the following block over each line (the block is terminated
         .. by }, but that doesn't exist, so it's until EOF)
 6>      .. Slice everything after the first six characters
   (     .. Uncons, so now the stack has the 6th character on top
         .. and the rest of the line second
    7#   .. Count the multiplicity of factors of 7 in the character
         .. (treated as an integer, so '*' is 42 and ' ' is 32)
      ;  .. Pop the top element of the stack (the rest of the line)...
       x .. ...that many times (so, don't pop if the 6th character was a
         .. space, and do pop if it was an asterisk)

こんにちは、私はゴルフのプログラミング言語を書きました。:)

私はまだこれを開発しており、スペースとアスタリスクを「7#」よりも区別するためのより合理的な方法があるように、これを書いた後に組み込みの束を追加/微調整しましたが、私はこれが競合しないように感じます。まだうまくいったのは幸運です(これは3日前にコミットしたv0.2.8の機能のみを使用しています)。


「こんにちは、私はゴルフのプログラミング言語を書きました。」使用しているバージョンは、このチャレンジが投稿される前または後にリリースされましたか?
マスト

1
3日前からこのバージョンで動作します:github.com/betaveros/paradoc/releases/tag/v0.2.8
betaveros

そうですね、あなたはそれについて言及しましたが、どういうわけかそれは明示的に登録されませんでし
マスト


7

オクターブ、23バイト

@(s)s(s(:,7)~=42,8:end)

オンラインでお試しください!


4
Octaveがそのような文字列を実行できるとは知りませんでした。xD
Sanchises

R2016bの文字列配列の導入以来、これはMATLAB @Sanchisesでも機能すると確信しています!現在、R2015bにしかアクセスできないため、確認できません。MATLABは74バイト、おそらく少ないでそれを行うことができ@(s)cellfun(@(r)r(8:end),s(cellfun(@(r)r(7)~=42,s)),'uniformoutput',false)sセル配列ではなく、文字列配列です。正規表現か何かを使用すると、おそらく短いことが、私が書いた方法は、単に古いMATLABのためにこの答えでは方法論に匹敵するだろう
Wolfie

6

ゼリー11 9バイト

ṫ€7Ḣ⁼¥Ðf⁶

オンラインでお試しください!

行のリストとして入力および出力します。

@EriktheOutgolferと@JonathanAllanのおかげで-2バイト

使い方

ṫ€7Ḣ=¥Ðf⁶
 €           On each line:
ṫ 7            Replace the line with line[7:]
      Ðf     Keep all lines that meet condition:
     ¥         Dyad:
   Ḣ             First Element (modifies line)
    =            Equals
        ⁶    Space

7$€することができます€7
エリックアウトゴルファー

:そのように9にそれを取るṫ€7Ḣ⁼¥Ðf⁶
ジョナサン・アラン


4

C、63 59 55 48 47 46バイト

さらに別のバイトを削除してくれた「匿名ユーザー」に感謝します。

Felix Palmenに、「7番目の文字は常にアスタリスクまたはスペースであると仮定することができます。」と思い出させてくれてありがとう。

f(char**a){for(;*a;++a)(*a)[6]&2||puts(*a+7);}

次のように使用します:

char** program = { "000000 apple", "000001 banana", "celery donuts", 0 };
f(program);

オンラインでお試しください!


3

実際には、13バイト

⌠6@tp' =*⌡M;░

入力と出力は文字列のリストとして行われます。

説明:

⌠6@tp' =*⌡M;░
⌠6@tp' =*⌡M    for each line:
 6@t             discard the first 6 characters
    p            pop the first character of the remainder
     ' =         is it a space?
        *        multiply the string by the boolean - returns the string if true, and an empty string if false
           ;░  filter out empty strings

オンラインでお試しください!


3

ガイア、9バイト

6>¦'*«⁈ḥ¦

文字列のリストを受け取り、文字列のリストを返す関数。

オンラインでお試しください!

説明

6>¦        Remove the first 6 characters of each string
   '*«⁈    Filter out ones that start with *
       ḥ¦  Remove the initial space from each

私は10文字を数えますが、3文字は非ASCIIなので、1バイト以上はかかりませんか?
WGroleau

@WGroleau «はどちらも1文字です。非ASCII文字(おそらくNeimを除く)を使用するゴルフ言語は、カスタムエンコードを使用します。これにより、これらの非ASCIIをすべて1バイトとしてカウントできます。こちらがガイアのコードページです。
氏Xcoder

@ Mr.Xcoder Neimにはエンコードもあります。
エリックアウトゴルファー

3

Pyth、9バイト

少なくとも1行がある場合にのみ動作することに注意してくださいませんコメントし、少なくとも1行があるコメント。他のすべてのソリューションはすべての場合に機能します。

@pizzakingmeに感謝-2バイト!

m>d7.m@b6

ここで試してみてください!

説明

m>d7.m@b6     - Full program with implicit input. Takes input as a list of Strings.

m>d7          - All but the first 7 letters of 
    .m   (Q)  - The input, filtered for its minimal value using the < operator on
      @b6     - the 7th character -- note that "*" is greater than " "
              - Implicitly Output the result.

Pyth、11バイト

tMfqhTdm>d6

ここで試してみてください!

説明

tMfqhTdm> d6-暗黙的な入力を伴う完全なプログラム。入力を文字列のリストとして受け取ります。

       m> d6-各行の最初の6文字を削除します。
    hT-それぞれの最初の文字を取得します。
  fq d-最初の文字がアスタリスクであるものを保持します。
tM-それぞれの最初の文字を削除します。
            -暗黙的に出力します。

Pyth、11バイト

m>d7fqd@T6Q

ここで試してみてください!

説明

m> d7fq @ T6dQ-完全なプログラム。入力を文字列のリストとして受け取ります。

      @ T6-それぞれの6番目の文字。
    fq dQ-スペースを含む行を^のままにします。
m> d7-最初の7文字を切り取ります。
             -暗黙的に出力します。

Pyth、12バイト

tMfnhT\*m>d6

ここで試してみてください!

説明

tMfnhT \ * m> d6-暗黙的な入力を伴う完全なプログラム。入力を文字列のリストとして受け取ります。

        m> d6-各行の最初の6文字を削除します。
    hT-それぞれの最初の文字を取得します。
  fn \ *-アスタリスクに等しくないものをフィルタリングします。
tM-それぞれの最初の文字を削除します。
             -暗黙的に出力します。

Pyth、12バイト

m>d7fn@T6\*Q

ここで試してみてください!

説明

m> d7fn @ T6 \ * Q-完全なプログラム。入力を文字列のリストとして受け取ります。

      @ T6-各文字列の6番目の文字を取得します
    fn \ * Q-アスタリスクに等しくないものをフィルタリングします。
m> d7-最初の7文字を切り取ります。
              -暗黙的に出力します。

最初の文字がアスタリスクであるものを保持します。」「最初の文字がアスタリスクではないものを保持する」ことを意味すると思います。
ケビンCruijssen

m>d7.m@b69バイトで動作し*、辞書編集順序でスペースの後にある虐待
Dave

必要に応じて、説明/テストリンクで編集できます。
デイブ

@pizzakingme私はモバイルにいるので、編集してくれてうれしいです。どうもありがとうございました。新しいソリューションの功績を称えてください。
ミスターXcoder

すべての行が行コメントである場合、これは機能しますか?(このケースを処理する必要があるかどうかは
わかり



3

Haskell27 25バイト

ライコニのバージョンは私のものよりも短い:

f n=[x|' ':x<-drop 6<$>n]

オンラインでお試しください!

私のバージョン:

f n=[drop 7x|x<-n,x!!6<'*']

オンラインでお試しください!


25バイト:f n=[x|' ':x<-drop 6<$>n]
ライコニ

@Laikoniそれはいいですね!! リスト内包表記のジェネレーターでパターンを一致させることができるとは知りませんでした。
jferard

3

C(gcc)53 48 46バイト

x;main(y){for(y=&x;gets(y-6);x&2||puts(y+1));}

オンラインでお試しください!

-5バイト:この「プログラム全体」をgurkaの関数と同じサイズにするには非常に注意が必要でした。間違った型の配列の境界外(両方向)に書き込みを行っており、アスタリスクを見つけるためにリトルエンディアン4バイトの整数に依存しています...

-2バイト:既に「ランダムな」.bss場所に書き込みを行っているのに、なぜ配列を宣言するのが面倒なのでしょうか。そこで、型配列使用しない文字列処理プログラムが登場します。char


いいね!そして、*x&2「7番目の文字は常にアスタリスクまたはスペースであると仮定することができます。」と思い出したので、答えからバイトを削ることができるはずです:
simon

@gurkaおかげで:D -2、hehe
フェリックス

3

R、47 45バイト

function(x)gsub("(?m)^.{6}( |.*\\n)","",x,,T)

入力を文字列のリストとして取得する場合、-6の正規表現を「^。{6}(|。* $)」に短縮できると思います。
CriminallyVulgar

@CriminallyVulgar正しい。この場合、pe=T引数を削除することもできます。ただし、文字列のリストとしての入力が許可されているかどうかはわかりません。
スベンホーエンシュタイン

OPから:Input or output may be a matrix or list.
完全に人間

@CriminallyVulgar問題は、出力に空の文字列が存在することです。
スベンホーエンシュタイン

@SvenHohensteinああ、もちろん、私はそれを考えていませんでした。
CriminallyVulgar

3

SNOBOL4(CSNOBOL4)72 70 66 50バイト

R	INPUT POS(6) (' '  REM . OUTPUT | '*') :S(R)
END

オンラインでお試しください!

SNOBOLのパターンマッチングは正規表現とはまったく異なりますが、ここでの考え方は同じです。行が「6文字、次にアスタリスク」に一致する場合、それを削除します。

これにより、実際にはSNOBOLの条件付き代入演算子をより活用できます。

パターンは次のようPOS(6) (' ' REM . OUTPUT | '*')に解釈されます:

位置6から開始して、スペースまたはアスタリスクに一致し、スペースに一致する場合は、行の残りをに割り当てOUTPUTます。


3

Vim、14バイト

Ctrl-VG5ld:%g/\*/dEnter

入力ファイルを編集するバッファーとしてロードし、上記のコマンドを入力します。出力は新しいバッファです。


2

ルビー39 38 36 29 23 22 20 + 1 = 21バイト

$_[/.{6}( |.*
)/]=''

オンラインでお試しください!

-pフラグを使用します。

説明:

-pフラグは、コードの周りに暗黙のブロックを追加しますので、実際に実行して取得するコードは次のようになります。

while gets
    $_[/.{6}( |.*
)/]=''

    puts $_
end

getsテキストの行を読み取り、その結果をに格納し$_ます。

$_[/.../]=''の正規表現の最初の出現を削除...$_ます。

/.{6}( |.*\n)/行の先頭にある任意の文字の6に一致し、その後にスペースまたは行の残りが続きます。最初にスペースが表示されるため、行全体を削除する前に、最初の6文字とスペースのみを削除しようとします。

$_ その後、印刷され、このプロセスが各行に対して繰り返されます。


1
Rubyのメソッド呼び出しには括弧は必要ありません。括弧を削除するとバイトが節約されます。
m-chrzan



2

JavaScript(ES6)、48バイト

s=>s.map(c=>c[6]<"*"?console.log(c.substr(7)):1)

オンラインでお試しください!


1
これは、入力がに保存されていることを前提としているため、関数でも完全なプログラムでもzありません。ここでは許可されていません。ただし、有効にするために、匿名の矢印関数に変換することもできます。
コイアリンガーアーイング

1
@cairdcoinheringaahingあなたは絶対に正しい。ソリューションを更新しました-fn ()取り巻くルールが何であるかわからないため、確認のために追加しました。
-sgtdck

1
()関数を囲む必要はありませんが、それ以外は問題ありません。
ケアニコインヘリンガー

2

> <>、57 53バイト

>i~i~i~i~i~i~i67*=\
<o$/?:$/?=a:;?(0:i<
\~$/~\ $
/  <o\?/

オンラインで試す

説明

>i~i~i~i~i~i~i67*=    Read in the first seven bytes of the line
 i~i~i~i~i~i~         Read, and discard 6 characters
             i        Read the seventh
              67*=    Check if the seventh character was an 
                      asterisk (and leave that value on the stack );

<o$/?:$/?=a:;?(0:i<    Read characters until a newline or eof
                 i     Read the next character of the line
            ;?(0:      If it's a -1, terminate the program
       /?=a:           If it's a newline, break out of the loop
   /?:$                If the seventh character was not an asterisk
<o$                    Output this character
\~$/                   otherwise discard it

   /~\ $    Having reached the end of the line, output
/  <o\?/    the newline only if it was not a comment

編集:53バイト

>   i~i~i~i~i~i~i67*=\
/?=a<o/?$@:$@:$;?(0:i<
~   \~/

基本的に以前と同じものですが、わずかに再構築されました

サイドノートとして:私は誰もまだこれをcobolで行っていないことに失望しています。


2

C#、160 145 90 89バイト

t=>{var o="";foreach(var s in i.Split('\n'))if(s[6]!=42)o+=s.Substring(7)+"\n";return o;}

サイズを小さくしてくれたPavelとauhmaanに感謝します。


PPCGへようこそ!他の人があなたのコードをテストできるように、あなたの答えにtry itオンラインリンクを追加することを提案します。それに加えて、素晴らしい最初(まあ、2番目)の答え!
LyricLy

次の形式でラムダを書くことでこれを短くすることができますt=>{...}
パベル

@LyricLy私は実際にそれをやろうとしましたが、何らかの理由で、これはそこで機能しません。ただし、VSコンソールアプリでは完全に機能します。
snorepion

@Pavelそうですか?完全に正しく行ったかどうかわかりません。以前にラムダ式を使用する必要はありませんでした。
snorepion

はい、正確に。に割り当てることでテストできfunc<string, string>ます。
パベル

2

Python 3、71バイト(正規表現なし)

def f(s):
 for w in s.split('\n'):
  t=w[6:]
  if t[0]!='*':print(t[1:])

できます!

>>> s="""000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges"""
>>> f(s)
blah blah
oranges?
love me some oranges


1

JavaScript、44 34バイト

取り消し線44は、まだ通常の44です。

tshのおかげで6バイト節約

a=>a.replace(/^.{6}( |.*\n)/gm,'')

オンラインでお試しください!


s=>s.replace(/^.{6}( |\*.*\s)?/mg,'')
tsh

s.match(/(?<=^.{6} ).*/mg) ESNext(非標準、Stage3)Chrome62 +
tsh

@tsh。それを可能にする安定したインタープリターができるまで、私はそれが有効なプログラミング言語として数えられないと思います。

最後の行がコメント行の場合、正しい出力が得られるようには見えません。
LyricLy

@LyricLy。入力には常に末尾の改行が含まれると想定したためです。入力の後に空の行があるので、それが機能することがわかります。想定しない場合、修正には1バイトかかります(?後に追加\n)。

1

C ++(GCC)、121 112バイト

9バイトを節約してくれた@gurkaに感謝します!

#import<bits/stdc++.h>
void f(std::list<std::string>l){for(auto s:l)if(s[6]-42)std::cout<<s.substr(7,s.size());}

入力を行のリストとして受け取ります。

オンラインでお試しください!


#import?また、標準インクルードを省略しても問題ないと思います。
サイモン

#importは標準C ++ではありませんが、少なくともGCCとMSVCはサポートしています。一部のインクルードを省略すると、Cで機能しますが、C ++では機能しません。コードはインクルードなしでは機能しないため、合計バイト数でカウントする必要があります。
-Steadybox

ああ、importPythonの回答やusingC#の回答には何も表示されないので、インクルードをスキップできると思った。また、#include <bits/stdc++.h>あなたの答えは短くなりませんか?
サイモン

@gurkaはい、短くなります。ありがとう!
Steadybox

@gurkaインポート Pythonの回答でカウントされます。Pythonにはインポート必要としない関数がたくさんあるだけです。それは書くために、一般的に短いですので、C#がステートメントを使用していない傾向にあるsystem.foo()よりも、using system;foo()
パベル

1

Java 8、95 54 53バイト

s->s.filter(x->x.charAt(6)<33).map(x->x.substring(7))

@OliverGrégoireのおかげStream<String>String、インおよび出力としてではなくaを使用して-42バイトになりました。

説明:

ここで試してみてください。

s->                          // Method with Stream<String> as parameter and return-type
  s.filter(x->x.charAt(6)<33)//  Filter out all lines containing an asterisk as 7th char
   .map(x->x.substring(7))   //  And remove the first 7 characters from the remaining lines
                             // End of method (implicit / single-line body)

String[]またはList<String>-12バイトの入力として使用できるようです。
ヤコブ

またはStream<String>それが役立つ場合。例:s->s.map(x->x.charAt(6)!=42?x.substring(7):"")
オリビエグレゴワール

1
ああ、それはフィルタリングする必要があります...そしてs->s.filter(x->x.charAt(6)!=42).map(x->x.substring(7))54バイトのために。
オリビエグレゴワール

1
<42代わりに使用するのは!=42、「7番目の文字は常にアスタリスクまたはスペースであると想定できるからです」。
オリビエグレゴワール

1
@OlivierGrégoireああ、そのルールを逃した、そうでなければ私は自分でそうするだろう。修正していただきありがとうございます。
ケビンCruijssen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.