/ *行番号コメントを生成* /


12

あなたの仕事は、入力として文字列を受け取り、次のルールを満たすすべての行の先頭にテキストを追加するプログラム(または関数)を書くことです。

  • 追加するテキストには行番号が含まれている必要があります。0または1ベースのインデックスを使用できます。
  • テキストはあなたの言語のコメントでなければなりません。コメントは、プログラムの状態を変更しない、構文的に有効なコードとして定義されます。コメントを削除しても、プログラムは変更されません。
  • コメントの最後には改行のみを含めることができます。
  • 空白とコメントのみを含む行に行番号を付ける必要はありません。

仕様書

  • 入力はあなたの言語の有効なプログラムであると仮定するかもしれません。
  • Pythonのようなインデントに敏感な言語では、すべてのインデントの後に行番号コメントを配置できます。インデント文字としてタブまたはスペースを選択できますが、投稿で指定する必要があります。
  • コード内のすべてのステートメントがせいぜい1行全体を占めると仮定することができます。つまり、複数行の文字列やバックスラッシュの連続はありません。

テストケース

Python:

#0
a = int(input())
#1
while a:
    #2
    print(a)

C:(正直、これがコンパイルされたことに驚いています)

/*0 */#include <stdio.h>
/*1 */int main()
/*2 */{
/*3 */    char c;
/*4 */    c = getchar();
/*5 */    do
/*6 */    {
/*7 */        putchar(c);
/*8 */    }
/*9 */    while (c);
/*10*/}

これはであるため、最短回答(バイト単位)が優先されます。


7
コメントを言語依存にすることは、物事を複雑にします。Python用の特別なルールを作成する必要がありました。複数行コメントを持たない他のすべての言語はどうですか?コメントがまったくない言語についてはどうでしょうか。副作用なしにコメントを配置できない複数行の文字列はどうですか?
デニス

4
おもしろい事実:「コメントを削除してもプログラムは変更されない」というルールは、Pythonの回答をすぐに失格にします。これは、コード(コメントを含む)が実行時にイントロスペクトできるためです。実稼働システムでこれが動作しているのを見ました:AssertionErrorスタックトレースにフレーズが含まれていない限り、コードの一部が発生foo.pyします。
-wchargin

2
コメントの最後にのみ改行を含めることができます」は、Cの「テストケース」と矛盾しています。
ピーターテイラー

2
コメントのない言語はどうですか?
-NoOneIsHere

4
編集は不整合を修正しません。
ピーターテイラー

回答:


5

パイク、7バイト

o\Kz++r

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

o       -  o++
 \K     -  "K"
   z    -  input()
    ++  - sum(^)
      r - while no errors: GOTO start

整数のコメントは、整数の後に文字Kと行が続くように宣言しています。余分なバイトを使用して、改行オペコードが余分なものを開始して印刷するのを停止します。


16

Perl、8 + 1 = 9バイト

say"#$."

-p(1バイトのペナルティ)で実行します。(PPCGルールに不慣れな人への注意。また-M5.010、を使用して最新バージョンのPerl構文を指定する必要がありますが、言語バージョンを選択するオプションは無料であり、バイトペナルティは発生しないと判断したため、ここでは言及しませんでしたこの投稿の元のバージョン。)

-pプログラムを暗黙のループに配置します。基本的に、プログラムは各行を個別に処理するフィルターになります(つまり、プログラム全体が最初の行で実行され、次に2行目、3行目、…と続きます)。Perlはまた$.、何行の入力が読み取られたかを記録すると呼ばれる行番号を追跡します。したがって、プログラムが行うことはすべて、-p入力の行を読み取らせることです。a #、現在の行番号($.)、および改行を出力します(sayデフォルトでは改行を追加します。これはこの場合に役立ち、一般的に見られるものよりも短いですprint)。そして、-p読み取ったコードの元の行を出力させます(通常は-p入力に対して何らかの処理を実行しますが、実行しなかったため、出力は変更されません)。Perlのコメントは#、改行(から#プログラム自体は文字列リテラル内にあるためコメントを開始しません)基本的には、処理中にファイルにコメント行を書き込むことができます、の「自然な」読み取りおよび書き込みサイクルを妨げることなく-p


これがどのように機能するか説明できますか?
アダム

承知しました。関連するPerl言語機能の操作をチュートリアルスタイルで説明しましたが、これは非常に基本的なPerlプログラムであり、実際には言語の力をあまり活用していないためです。-pただし、ループまたは自動更新される行番号がどのように機能するかを誰もが知っているわけではないことを覚えておく必要があります。

say"$.;"質問は「コード内のすべてのステートメントがせいぜい1行全体を占めると仮定することができる」と指定されているため、同様に機能することに注意してください。
msh210

ただし、実際にはコメントではありません。有用なことは何もありませんが、最終的にはASTになります(また、Perlのオプティマイザーはややこしいので、実際にプログラムの速度を落とすと思いますが、実際にはコメントをしたくないでしょう)。

ルールが機能しない空白とコメントのみを含む行に行番号を付ける必要はありません。
デニスイバエフ

9

Javascript、43 39バイト

a=>a.replace(/^/gm,_=>`/*${++b}*/`,b=0)

4バイトを節約してくれたETHとConorに感謝します。


41バイト:a =>(b = 0、a.replace(/ ^ / gm、_ => /*${++b}*/))(フォーマット文字列を使用)
コナーオブライエン

1
39バイト:a=>a.replace(/^/gm,_=>`/*${++b}*/`,b=0)
ETHproductions


3

バッチ、91バイト

@set n=
@for /f "delims= tokens=*" %%a in (%1) do @set/an+=1&call echo @rem %%n%%&echo %%a

バッチにはEOFまでSTDINを読み取る方法がないため、代わりにファイル名をコマンドラインパラメーターとして渡す必要があります。


3

Lua、80 75バイト

言語を乱用することでいくつかのバイトを節約しました。

x=1print("--[[1]]"..(...):gsub("\n",load('x=x+1return"\\n--[["..x.."]]"')))

簡単なスターターの答え。

Ungolfed、+

x=1                                                     -- Assign x to 1...
print(                                                  -- Print...
      "--[[1]]"                                         -- The first line number comment...
      ..                                                -- With...
      (...):gsub(                                       -- The input, replacing all...
                 "\n",                                  -- Newlines...
                    load                                -- with a string compiled function...
                    (' \
                    x=x+1                               --Increment x by one... \
                    return"\\n--[["..x.."]]"            -- And return the new linecomment. \
                    ')
                 )
      )

Luaは知りませんが、常に同じ長さのコメントが生成されると確信していますか?たとえば、プログラムの長さが10行の場合、最後のコメントは、スペースで正しくパディングしない限り--[[10]]1文字長くなり--[[9]]ます。
エソランジングフルーツ

1
ああ、私はその規則に気づかなかった。それはそうです... Aは冗長ビット...
ATaco

1
はい。多分それを削除します... [編集]:削除されました。
エソランジングフルーツ

3

Gema、16 15文字

*\n=\!@line\n$0

Gemaには、で始まる行コメントのみがあります!

サンプル実行:

bash-4.3$ cat l33t.gema 
e=3
g=9
i=1
o=0
t=7

bash-4.3$ gema -f l33t.gema <<< 'Hello World!'
H3ll0 W0rld!

bash-4.3$ gema '*\n=\!@line\n$0' < l33t.gema > l33t-nr.gema

bash-4.3$ cat l33t-nr.gema
!1
e=3
!2
g=9
!3
i=1
!4
o=0
!5
t=7

bash-4.3$ gema -f l33t-nr.gema <<< 'Hello World!'
H3ll0 W0rld!

以下は答えることです 、無視されたコードのような行番号を追加できるかどうか、Adámの質問ことです。

Gemaコードは、本質的にfrom = to変換ルールのコレクション、またはGema用語でテンプレート = アクションです。テンプレートを定義する方法がない決して決して一致することのないいません。これだけでは方法とは思えません。

Gema、18文字

*\n=c:\=@line\;:$0

トランスフォームe=3c:=1;:e=3ます。

幸いなことにGemaにはドメインがあります名前空間があります。上記のコードは、名前空間cで使用しないダミールールを定義しています。残念ながら、言及されたドメインは行末まで有効であるため、明示的にデフォルトドメインに切り替える必要があります。

Gema、18文字

*\n=@line\=\$0\;$0

トランスフォームe=31=$0;e=3ます。

それほど複雑ではない方法は、無視されたコードの代わりに効果のないコードを使用することです。一致したものを正確に戻すことを意味します。


しかし、文字列を挿入し、その周りにいくつかのコードがあり、無視することができませんでしたか?
アダム

あなたは、現在の代わりにe=3変換されたようなものを意味しますか?ええ、19文字の回避策があります。if (false) { 1 }; e=3!1␤e=3
マナトワーク

2

Qbasic、91 89バイト

OPEN"I",1,"i"
OPEN"O",2,"o"
DO UNTIL EOF(1)
i=i+1
INPUT#1,a$
PRINT#2,STR$(i)+"'"+a$
LOOP

入力:

CLS
PRINT "Hello!"
a$="Welcome"
INPUT "Type your name: ", b$
PRINT a$; ", "; b$
END

出力:

 1'CLS
 2'PRINT "Hello!"
 3'a$="Welcome"
 4'INPUT "Type your name: ", b$
 5'PRINT a$; ", "; b$
 6'END

1
QBasicを使用してからしばらく経ちましたが、行番号ではなく、プログラムテキストがすべてコメントになりませんか?それとも私は何かを間違って覚えていますか?

入力いただきありがとうございます!実際には、 'はその行に続くコメントだけをコメントします。
匿名2

4
はい、それがプログラムをコメントに変えていると思う理由です。行番号を追加するだけでなく、何もしないプログラムに意味を変更します。(正直なところ、BASIC方言のエントリで実際の行番号を追加し、既に番号が付いている場合はプログラムに番号を付け直すことはクールですが、おそらくそれは実際には必要ありません。)

2

BASH(+ GNU sed)27バイト

sed 'i#
='|sed 'N;s/\n//;N'

最初の部分(i# \n =)は、ほぼGNU sed(4バイト)で機能しますが、の後に改行を追加します#


2

awk( 19 13バイト)

19バイト:コードの各行の上に「#」+行番号を挿入します

{print"#"NR"\n"$0}

13バイト:2つの13バイトソリューションに対するクレジットと@manatworkのおかげ

同様1に、アクションのデフォルトprint $0

{print"#"NR}1

または$0コンテンツを置き換えることにより

$0="#"NR RS$0

{print"#"NR}1または$0="#"NR RS$0
マナトワーク

@manatwork私はそれらの繊細さを発見することを非常に恥ずかしく思い、感謝しています
アダム

2

Kotlin拡張機能、69 60バイト

fun String.a()=lines().mapIndexed{i,s->"/*$i*/$s"}.joinToString("\n")

fun String.a(){lines().mapIndexed{i,s->println("/*$i*/$s")}}

使用例:

fun main(args: Array<String>) {
  //language=kotlin
  val code = """fun main(args: Array<String>) {
  println("Hello world!")
}"""
  code.a()
}

出力:

/*0*/fun main(args: Array<String>) {
/*1*/  println("Hello world!")
/*2*/}

1

CJam、21バイト

私はCJamにまったく精通していませんが、コメントがあるという事実を知っていました:)

qN%ee{"e#"o(oNo(oNo}/

説明はすぐに来ます。


oNonTIO で置き換えることができます。
エソランジングフルーツ


1

jq、31文字

(27文字のコード+ 4文字のコマンドラインオプション。)

"#\(input_line_number)\n"+.

jqで始まる行コメントのみ #

サンプル実行:

bash-4.3$ cat l33t.jq 
gsub("e";"3")|
gsub("g";"9")|
gsub("i";"1")|
gsub("o";"0")|
gsub("t";"7")

bash-4.3$ jq -Rr -f l33t.jq <<< 'Hello World!'
H3ll0 W0rld!

bash-4.3$ jq -Rr '"#\(input_line_number)\n"+.' l33t.jq > l33t-nr.jq

bash-4.3$ cat l33t-nr.jq 
#1
gsub("e";"3")|
#2
gsub("g";"9")|
#3
gsub("i";"1")|
#4
gsub("o";"0")|
#5
gsub("t";"7")

bash-4.3$ jq -Rr -f l33t-nr.jq <<< 'Hello World!'
H3ll0 W0rld!

親愛なるPerlおよびRubyのコーダー、jqを観察してくださいinput_line_number。感謝祭であること、表現する特別な気持ちは$.
マナトワーク

1

GolfScript、23バイト

n/0:i;{"#"i):i+n+\+}%n*

「#」で始まる行コメントのみがあります。

Ungolfed&説明:

           # the input is pushed on the stack automatically
n          # n is a predefined variable for "\n"
/          # splits the input string with the previously pushed "\n" as delimiter
0:i;       # i = 0
{          # A code block: It is used for map here (going through the input)
    "#"    # push a "#" onto the stack
    i):i  # save i + 1 in i, the value is again not popped from the stack
    +      # implicitly converts the number i to a string and concatenates "#" with it
    n      # newline
    +      # add a newline (# introduces a *line* comment)
    \      # switch the top to elements (-> yields the comment as the bottom, and the line as the top element on the stack)
    +      # concatenate them
}          # end of the code block
%          # map
n          # newline
*          # join the list with newlines between them
           # outputs are done implicitly

これはさらに簡単にできると確信しています。特に iています。省略可能です。

ここでテストできます:https : //golfscript.apphb.com/ このサイトは入力の追加をサポートしていないため、コードの前に二重引用符で囲まれた文字列を配置する必要があります。'\n'改行になります。他のエスケープシーケンスも存在するという事実に注意してください。'\\'不明な場合はユーザー。


1

C#6、66 61バイト

CSharpieに感謝

(666、悪魔のコード^^)もうない...

これは、「Cスタイルのコメント」(C、C ++、C#、Javaなど)を使用するすべての言語で機能します。

文字列を行に分割し、すべての行にインデックスを追加して、編集した行を新しい行文字で再び結合します。

s=>string.Join("\n",s.Split('\n').Select((l,i)=>$"/*{i}*/"+l));

古いバージョン:

s=>string.Join("\n",s.Split('\n').Select((l,i)=>$"/*{i,3}*/{l}"));

1
技術的には、64はopがゼロでパディングすることに言及しなかったためです。また、$ "/ * {i} * /" + lを使用すると、さらに1バイト節約できます。(Lパラメーターを補間から外します。)
CSharpie

あなたは正しい^^ですが、それは私の「邪悪なスコア」を破壊しますhehe-
ステファン

0

Python 2、82バイト

スペースのみのインデントに対応

for i,l in enumerate(input().split('\n')):print l.split(l.lstrip())[0]+'#%d\n'%i+l

56バイトのインデントなしバージョン

for x in enumerate(input().split('\n')):print'#%d\n%s'%x
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.