Hasilkan / * komentar nomor baris * /


12

Tugas Anda adalah menulis program (atau fungsi) yang akan mengambil string sebagai input dan menambahkan teks ke awal setiap baris yang memenuhi aturan berikut:

  • Teks yang ditambahkan harus berisi nomor baris. Anda dapat menggunakan pengindeksan berbasis 0 atau 1.
  • Teks harus berupa komentar dalam bahasa Anda. Sebuah komentar didefinisikan sebagai potongan kode yang valid secara sintaksis yang tidak membuat perubahan pada status program. Menghapus komentar seharusnya tidak membuat perubahan pada program.
  • Komentar hanya dapat memuat baris baru di bagian akhir.
  • Anda tidak harus memasukkan nomor baris untuk baris yang hanya berisi spasi putih dan komentar.

Spesifikasi

  • Anda dapat berasumsi bahwa input akan menjadi program yang valid dalam bahasa Anda.
  • Dalam bahasa yang sensitif terhadap indentasi seperti Python, Anda dapat menempatkan komentar nomor baris setelah semua indentasi. Anda dapat memilih tab atau spasi untuk menjadi karakter lekukan Anda, tetapi Anda harus menentukan pada posting Anda.
  • Anda dapat mengasumsikan bahwa setiap pernyataan dalam kode akan mengambil paling banyak keseluruhan dari 1 baris; yaitu tidak ada multi-line string atau garis miring terbalik

Uji Kasus

Python:

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

C: (Jujur, saya terkejut kompilasi ini)

/*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*/}

Ini adalah , jadi jawaban tersingkat (dalam byte) menang.


7
Membuat komentar bergantung pada bahasa membuat segalanya menjadi rumit. Anda sudah harus membuat aturan khusus untuk Python. Bagaimana dengan semua bahasa lain yang tidak memiliki komentar multi-baris? Bagaimana dengan bahasa yang tidak memiliki komentar sama sekali. Bagaimana dengan string multi-baris di mana komentar tidak dapat ditempatkan tanpa efek samping?
Dennis

4
Fakta menyenangkan: aturan "menghapus komentar seharusnya tidak membuat perubahan ke program" segera mendiskualifikasi jawaban Python, karena kode — termasuk komentar — dapat diintrospeksi saat runtime. Saya telah melihat ini berperan dalam sistem produksi: sepotong kode akan menaikkan AssertionErrorkecuali jejak stack berisi frasa foo.py, yang diharapkan berasal dari nama file tetapi juga dapat muncul sebagai komentar baris dalam konteks.
wchargin

2
" Komentar hanya dapat berisi baris baru pada akhir itu " tidak konsisten dengan C " test case ".
Peter Taylor

2
Bagaimana dengan poni tanpa komentar?
NoOneIsHere

4
Hasil edit tidak memperbaiki ketidakkonsistenan.
Peter Taylor

Jawaban:


5

Pyke, 7 byte

o\Kz++r

Coba di sini!

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

Saya menyatakan komentar integer sebagai integer yang diikuti oleh karakter Kdan kemudian baris. Byte tambahan digunakan untuk menghentikan opcode baris baru dari menendang dan mencetak hal tambahan.


16

Perl, 8 + 1 = 9 byte

say"#$."

Jalankan dengan -p(penalti 1 byte). (Catatan untuk orang-orang yang tidak terbiasa dengan aturan PPCG; Anda juga perlu menentukan versi modern dari sintaks Perl yang digunakan -M5.010, tetapi kami memutuskan bahwa opsi untuk memilih versi bahasa gratis dan tidak dikenakan penalti byte, jadi saya tidak menyebutkannya dalam versi asli dari posting ini.)

-pmenempatkan program ke dalam loop implisit; pada dasarnya menyebabkan program menjadi filter yang memproses setiap baris secara terpisah (yaitu seluruh program dijalankan pada baris pertama, lalu yang kedua, kemudian yang ketiga, dan seterusnya). Perl juga melacak nomor baris, yang disebut $., yang mencatat berapa banyak baris input telah dibaca. Jadi semua yang dilakukan program adalah membiarkan -pmembaca sederet input; output a #, nomor baris saat ini ( $.), dan baris baru ( saymenambahkan baris baru secara default, yang membantu dalam kasus ini, dan juga lebih pendek daripada yang lebih sering terlihat print); dan kemudian membiarkan -poutput baris kode asli yang dibacanya (biasanya program menggunakan-pakan melakukan semacam pemrosesan pada input, tetapi karena kami tidak, itu hanya output tidak berubah). Komentar dalam Perl dijalankan dari #baris baru ( #program itu sendiri tidak memulai komentar karena itu di dalam string literal), jadi yang pada dasarnya kita lakukan adalah mengambil kesempatan untuk menulis baris komentar ke dalam file saat kita memprosesnya , tanpa mengganggu siklus "baca dan tulis" alami " -p.


Bisakah Anda menjelaskan cara kerjanya?
Adám

Tentu. Saya telah menjelaskan pengoperasian fitur bahasa Perl yang relevan dalam gaya tutorial, mengingat bahwa ini adalah program Perl yang sangat dasar yang tidak terlalu banyak menggunakan kekuatan bahasa. Saya perlu ingat bahwa tidak semua orang tahu cara kerja -ploop atau nomor baris yang diperbarui secara otomatis.

Catatan yang say"$.;"akan bekerja juga, karena pertanyaan yang ditentukan bahwa "Anda dapat mengasumsikan bahwa setiap pernyataan dalam kode akan mengambil paling banyak keseluruhan dari 1 baris".
msh210

Tapi itu bukan komentar; meskipun tidak ada gunanya, itu berakhir di AST (dan karena pengoptimal Perl adalah jenis sial, saya pikir itu benar-benar akan memperlambat program, sesuatu yang Anda tidak benar-benar ingin komentar lakukan).

Tidak berfungsi untuk aturan Anda tidak perlu memasukkan nomor baris untuk baris yang hanya berisi spasi putih dan komentar.
Denis Ibaev

9

Javascript, 43 39 byte

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

Terima kasih kepada ETH dan Conor untuk menghemat 4 byte.


41 byte: a => (b = 0, a.replace (/ ^ / gm, _ => /*${++b}*/)) (gunakan string pemformatan)
Conor O'Brien

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


3

Batch, 91 byte

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

Batch tidak memiliki cara membaca STDIN hingga EOF, jadi alih-alih nama file harus dilewatkan sebagai parameter baris perintah.


3

Lua, 80 75 Bytes

Menyimpan beberapa byte dengan menyalahgunakan langauge.

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

Jawaban pemula yang cukup sederhana.

Tidak digabung, +

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. \
                    ')
                 )
      )

Saya tidak tahu Lua, tetapi apakah Anda yakin itu akan selalu menghasilkan komentar yang panjangnya sama? Misalnya jika suatu program panjangnya 10 baris dari komentar terakhir akan berarti --[[10]]1 karakter lebih panjang dari --[[9]]kecuali Anda benar padu dengan spasi.
Buah Esolanging

1
Oh, saya tidak memperhatikan aturan itu. Tampaknya ... Sedikit berlebihan ...
ATaco

1
Iya. Mungkin saya akan menghapusnya ... [EDIT]: dihapus.
Buah Esolanging

3

Gema, 16 15 karakter

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

Di Gema hanya ada komentar baris, dimulai dengan !.

Contoh dijalankan:

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!

Berikut ini adalah untuk menjawab pertanyaan Adám , apakah mungkin untuk menambahkan nomor baris dalam jenis kode yang diabaikan.

Kode Gema pada dasarnya adalah kumpulan dari = untuk aturan transformasi, atau template = tindakan dalam istilah Gema. Saya tidak melihat cara untuk mendefinisikan template yang tidak akan pernah cocok dengan apa pun, ini saja sepertinya bukan jalannya.

Gema, 18 karakter

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

Berubah e=3menjadi c:=1;:e=3.

Untungnya di Gema ada domain , semacam ruang nama. Kode di atas mendefinisikan aturan dummy di namespace c, yang tidak pernah kita gunakan. Sayangnya domain yang disebutkan tetap berlaku sampai akhir baris, jadi kami harus secara eksplisit untuk beralih kembali ke domain default.

Gema, 18 karakter

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

Berubah e=3menjadi 1=$0;e=3.

Alternatif yang tidak terlalu rumit adalah menggunakan kode tanpa efek daripada mengabaikannya. Maksud saya untuk mengembalikan apa yang cocok.


Tapi tidak bisakah Anda memasukkan string dan memiliki beberapa kode di sekitarnya yang membuatnya diabaikan?
Adám

Maksudmu jenis e=3diubah if (false) { 1 }; e=3alih-alih saat ini !1␤e=3? Ya, akan ada solusi panjang 19 karakter.
manatwork

2

Qbasic, 91 89 byte

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

Memasukkan:

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

Keluaran:

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

1
Sudah lama sejak saya menggunakan QBasic, tetapi bukankah itu membuat teks program semua komentar, bukan nomor baris? Atau apakah saya salah mengingat sesuatu?

Terima kasih atas masukannya! Sebenarnya, 'hanya komentar yang mengikuti di telepon.
anonymous2

4
Ya, itulah sebabnya saya pikir ini mengubah program menjadi komentar. Alih-alih hanya menambahkan nomor baris, itu mengubah makna menjadi program yang tidak melakukan apa pun. (Jujur, itu akan keren untuk entri dalam dialek BASIC untuk menambahkan nomor baris nyata dan memberi nomor baru program jika sudah memiliki angka, tapi itu mungkin tidak benar-benar diperlukan.)

2

BASH (+ GNU sed) 27 byte

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

Bagian pertama ( i# \n =) hampir berfungsi di sed GNU (untuk 4 byte), tetapi menempatkan baris baru setelah #.


2

awk ( 19 13 bytes)

19 byte : Ini menyisipkan "#" + nomor baris di atas setiap baris kode

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

13 byte : Kredit & terima kasih kepada @manatwork untuk dua solusi 13 byte

Sebagai 1tindakan bawaan untuk print $0:

{print"#"NR}1

Atau dengan mengganti $0konten

$0="#"NR RS$0

{print"#"NR}1atau $0="#"NR RS$0?
manatwork

@manatwork saya cukup malu dan bersyukur menemukan subtilitas itu
Adam

2

Fungsi ekstensi Kotlin, 69 60 byte

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

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

Contoh penggunaan:

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

Keluaran:

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

1

CJam, 21 Bytes

Saya tidak berpengalaman dalam CJam sama sekali, tapi saya tahu pasti ada komentar :)

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

Penjelasan segera hadir.


oNodapat diganti dengan ndi TIO.
Buah Esolanging


1

jq, 31 karakter

(27 karakter kode + 4 opsi opsi baris perintah.)

"#\(input_line_number)\n"+.

Di jq hanya ada komentar baris, dimulai dengan #.

Contoh dijalankan:

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!

Para coders Perl dan Ruby yang terhormat, mohon perhatikan jq input_line_number. Menjadi Thanksgiving, ada perasaan khusus untuk diungkapkan $.?
manatwork

1

GolfScript, 23 Bytes

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

Hanya ada komentar baris yang dimulai dengan "#".

Tidak digabungkan & dijelaskan:

           # 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

Saya cukup yakin bahwa ini dapat lebih disederhanakan, terutama yang imungkin dapat ditinggalkan.

Anda dapat mengujinya di sini: https://golfscript.apphb.com/ Karena situs ini tidak mendukung penambahan input, Anda harus meletakkan string yang dikelilingi dengan tanda kutip ganda di depan kode. '\n'akan menjadi baris baru. Sadarilah fakta, bahwa ada urutan pelarian lainnya juga. Pengguna '\\'jika Anda tidak yakin.


1

C # 6, 66 61 byte

Terima kasih kepada CSharpie

(666, kode setan ^^) tidak lagi ...

Ini berfungsi untuk semua bahasa menggunakan "Komentar gaya C" (C, C ++, C #, Java, ....)

Ini hanya membagi string menjadi garis, menambahkan setiap baris dengan indeksnya dan bergabung dengan garis yang diedit lagi dengan karakter baris baru.

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

versi lama:

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

1
Secara teknis 64 sejak op tidak menyebutkan padding dengan nol. Anda juga dapat menyimpan 1 byte lebih banyak dengan memutar: $ "/ * {i} * /" + l. (Memindahkan parameter-L dari interpolasi.)
CSharpie

Anda benar ^^ tetapi itu menghancurkan "skor jahat" saya hehe
Stefan

0

Python 2, 82 byte

Bekerja untuk lekukan khusus ruang

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

Versi indentasi-kurang untuk 56 byte

for x in enumerate(input().split('\n')):print'#%d\n%s'%x
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.