สร้าง / * ความคิดเห็นหมายเลขบรรทัด * /


12

งานของคุณคือการเขียนโปรแกรม (หรือฟังก์ชั่น) ที่จะใช้สตริงเป็นอินพุตและต่อท้ายข้อความที่จุดเริ่มต้นของทุกบรรทัดที่เป็นไปตามกฎต่อไปนี้:

  • ข้อความต่อท้ายต้องมีหมายเลขบรรทัด คุณอาจใช้การจัดทำดัชนี 0- หรือ 1
  • ข้อความต้องเป็นความคิดเห็นในภาษาของคุณ ความคิดเห็นถูกกำหนดให้เป็นส่วนหนึ่งของรหัสที่ถูกต้อง syntacticly ที่ทำให้ไม่มีการเปลี่ยนแปลงสถานะของโปรแกรม การลบความคิดเห็นไม่ควรเปลี่ยนแปลงโปรแกรม
  • ความคิดเห็นอาจมีการขึ้นบรรทัดใหม่ในตอนท้ายของมัน
  • คุณไม่จำเป็นต้องใส่หมายเลขบรรทัดสำหรับบรรทัดที่มีเพียงช่องว่างและความคิดเห็น

ข้อมูลจำเพาะ

  • คุณอาจสมมติว่าการป้อนข้อมูลจะเป็นโปรแกรมที่ถูกต้องในภาษาของคุณ
  • ในภาษาที่ไวต่อการเยื้องเช่น Python คุณสามารถใส่ความคิดเห็นหมายเลขบรรทัดหลังจากการเยื้องทั้งหมด คุณสามารถเลือกแท็บหรือช่องว่างให้เป็นอักขระย่อหน้าได้ แต่คุณต้องระบุในโพสต์
  • คุณอาจสันนิษฐานว่าทุกคำสั่งในรหัสจะใช้เวลาสูงสุด 1 บรรทัด เช่นไม่มีสตริงหลายบรรทัดหรือแบ็กสแลชต่อเนื่อง

กรณีทดสอบ

งูหลาม:

#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 แล้วภาษาอื่น ๆ ทั้งหมดที่ไม่มีความคิดเห็นแบบหลายบรรทัดล่ะ เกี่ยวกับภาษาที่ไม่มีความคิดเห็นเลย สิ่งที่เกี่ยวกับสตริงหลายบรรทัดที่ความคิดเห็นไม่สามารถวางได้โดยไม่มีผลข้างเคียง?
Dennis

4
ความจริงเรื่องสนุก: กฎ "การลบความคิดเห็นไม่ควรทำการเปลี่ยนแปลงโปรแกรม" จะตัดสิทธิ์คำตอบของ Python ทันทีเนื่องจากรหัส - รวมถึงความคิดเห็น - อาจถูกวิปัสสนา ณ รันไทม์ ฉันได้เห็นสิ่งนี้ในการเล่นในระบบที่ใช้งานจริง: ชิ้นส่วนของรหัสจะยกระดับAssertionErrorหากไม่มีการติดตามสแต็กที่มีวลีfoo.pyซึ่งคาดว่าจะมาจากชื่อไฟล์ แต่อาจปรากฏเป็นความคิดเห็นบรรทัดในบริบท
wchargin

2
" ความคิดเห็นสามารถมีการขึ้นบรรทัดใหม่ได้ในตอนท้าย " ไม่สอดคล้องกับ C " กรณีทดสอบ "
Peter Taylor

2
แล้ว langs ที่ไม่มีความคิดเห็นล่ะ?
NoOneIsHere

4
การแก้ไขไม่ได้แก้ไขความไม่สอดคล้องกัน
Peter Taylor

คำตอบ:


5

Pyke ขนาด 7 ไบต์

o\Kz++r

ลองที่นี่!

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

ฉันประกาศความคิดเห็นจำนวนเต็มเป็นจำนวนเต็มตามด้วยตัวละครKแล้วตามด้วยบรรทัด ไบต์พิเศษถูกใช้เพื่อหยุด opline ขึ้นบรรทัดใหม่จาก kicking และพิมพ์สิ่งพิเศษ


16

Perl, 8 + 1 = 9 ไบต์

say"#$."

ทำงานด้วย-p(การลงโทษ 1 ไบต์) (หมายเหตุสำหรับคนที่ไม่คุ้นเคยกับกฎ PPCG คุณต้องระบุไวยากรณ์ที่ใช้ Perl รุ่นใหม่ด้วย-M5.010แต่เราตัดสินใจว่าตัวเลือกในการเลือกรุ่นภาษานั้นฟรีและไม่ต้องเสียค่าปรับไบต์ดังนั้นฉันจึงไม่ได้กล่าวถึงใน รุ่นเดิมของโพสต์นี้)

-pวางโปรแกรมลงในลูปโดยปริยาย มันเป็นสาเหตุให้โปรแกรมกลายเป็นตัวกรองที่ประมวลผลแต่ละบรรทัดแยกกัน (เช่นโปรแกรมทั้งหมดทำงานในบรรทัดแรกจากนั้นเป็นครั้งที่สองจากนั้นเป็นครั้งที่สามและต่อไปเรื่อย ๆ ) Perl ยังติดตามหมายเลขบรรทัดที่เรียกว่า$.ซึ่งจะบันทึกจำนวนอินพุตบรรทัดที่ถูกอ่าน ดังนั้นสิ่งที่โปรแกรมทำทั้งหมดคือให้-pอ่านบรรทัดอินพุต เอาท์พุต#หมายเลขบรรทัดปัจจุบัน ( $.) และขึ้นบรรทัดใหม่ ( sayเพิ่มบรรทัดใหม่ตามค่าเริ่มต้นซึ่งมีประโยชน์ในกรณีนี้และสั้นกว่าที่เห็นบ่อยกว่าprint) แล้วปล่อย-pบรรทัดรหัสต้นฉบับที่อ่านออกมา (โดยทั่วไปคือโปรแกรมที่ใช้-pจะทำการประมวลผลบางอย่างกับอินพุต แต่เนื่องจากเราไม่ทำมันแค่เอาท์พุทไม่เปลี่ยนแปลง ความคิดเห็นใน Perl วิ่งจาก#ไปยังบรรทัดใหม่ ( #ในตัวโปรแกรมเองไม่ได้เริ่มต้นความคิดเห็นเพราะมันอยู่ในตัวอักษรสตริง) ดังนั้นสิ่งที่เรากำลังทำคือการใช้โอกาสในการเขียนบรรทัดความคิดเห็นลงในไฟล์ในขณะที่เราดำเนินการ โดยไม่ต้องรบกวน "ธรรมชาติ" -pการอ่านและเขียนวงจรของ


คุณอธิบายได้ไหมว่ามันทำงานอย่างไร
59

แน่ใจ ฉันได้อธิบายการทำงานของคุณสมบัติภาษา Perl ที่เกี่ยวข้องในรูปแบบการสอนเนื่องจากมันเป็นโปรแกรม Perl ขั้นพื้นฐานที่ไม่ได้ใช้ประโยชน์จากพลังของภาษามากนัก ฉันต้องจำไว้ว่าไม่ใช่ทุกคนที่รู้ว่า-pลูปหรือการอัพเดตหมายเลขบรรทัดอัตโนมัติทำงานอย่างไร

โปรดทราบว่าsay"$.;"จะใช้งานได้เช่นกันเพราะคำถามระบุว่า "คุณอาจสันนิษฐานว่าทุกคำสั่งในรหัสจะใช้เวลาสูงสุด 1 บรรทัด"
msh210

นั่นไม่ใช่ความเห็นที่แท้จริง แม้ว่ามันจะไม่มีประโยชน์อะไรเลย แต่มันก็จบลงใน AST (และเนื่องจากเครื่องมือเพิ่มประสิทธิภาพของ Perl นั้นเป็นงานที่น่าเบื่อ แต่ฉันคิดว่าจริง ๆ แล้วมันจะจบลงด้วยการทำให้โปรแกรมช้าลง

ไม่ทำงานสำหรับกฎคุณไม่จำเป็นต้องใส่หมายเลขบรรทัดสำหรับบรรทัดที่มีเพียงช่องว่างและความคิดเห็น
เดนิส Ibaev

9

Javascript, 43 39 ไบต์

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

ขอบคุณ ETH และ Conor สำหรับการบันทึก 4 ไบต์


41 ไบต์: a => (b = 0, a.replace (/ ^ / gm, _ => /*${++b}*/)) (ใช้สตริงการจัดรูปแบบ)
Conor O'Brien

1
39 bytes: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

ชุดไม่มีวิธีการอ่าน STDIN จนกว่า EOF ดังนั้นแทนที่จะต้องส่งชื่อไฟล์เป็นพารามิเตอร์บรรทัดคำสั่ง


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
โอ้ฉันไม่ได้สังเกตกฎนั้น ดูเหมือน ... ซ้ำซ้อนเล็กน้อย ...
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 = ถึงกฎการแปลงหรือtemplate = actionในเงื่อนไข Gema ฉันไม่เห็นวิธีกำหนดเทมเพลตที่จะไม่ตรงกับสิ่งใดเลยสิ่งนี้เพียงอย่างเดียวดูเหมือนจะไม่เป็นเช่นนั้น

Gema, 18 ตัวอักษร

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

แปลงลงในe=3c:=1;:e=3

โชคดีที่ Gema มีโดเมนเป็นประเภทของเนมสเปซ รหัสข้างต้นกำหนดกฎดัมมี่ใน namespace c ที่เราไม่เคยใช้ น่าเสียดายที่โดเมนที่กล่าวถึงยังคงมีผลจนกว่าจะสิ้นสุดบรรทัดดังนั้นเราจึงต้องเปลี่ยนกลับไปใช้โดเมนเริ่มต้นอย่างชัดเจน

Gema, 18 ตัวอักษร

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

แปลงลงในe=31=$0;e=3

ทางเลือกที่ซับซ้อนน้อยกว่าคือการใช้โค้ดที่ไม่มีผลแทนการละเว้นรหัส ฉันหมายถึงเอาสิ่งที่ตรงกันกลับมา


แต่คุณไม่สามารถแทรกสตริงและมีรหัสอยู่รอบ ๆ ซึ่งทำให้มันถูกละเว้น?
59

คุณหมายถึงประเภทของการe=3แปลงในif (false) { 1 }; e=3แทนที่จะเป็นปัจจุบัน!1␤e=3? ใช่จะมีวิธีแก้ปัญหาที่ยาว 19 ตัวอักษร
จัดการ

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
ใช่ซึ่งเป็นเหตุผลที่ฉันคิดว่ามันเปลี่ยนโปรแกรมเป็นความคิดเห็น แทนที่จะเพียงแค่เพิ่มหมายเลขบรรทัดมันจะเปลี่ยนความหมายลงในโปรแกรมที่ไม่ทำอะไรเลย (จริงๆแล้วมันจะเจ๋งสำหรับรายการในภาษาพื้นฐานเพื่อเพิ่มหมายเลขบรรทัดจริงและกำหนดหมายเลขโปรแกรมใหม่หากมีตัวเลขอยู่แล้ว แต่อาจไม่จำเป็นจริงๆ)

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 ไบต์ : เครดิต & ขอบคุณ @manatwork สำหรับโซลูชันขนาด 13 ไบต์สองรายการ

ในฐานะที่เป็น1ค่าเริ่มต้นการกระทำไปที่print $0:

{print"#"NR}1

หรือโดยการแทนที่$0เนื้อหา

$0="#"NR RS$0

{print"#"NR}1หรือ$0="#"NR RS$0?
จัดการ

@ manatwork ฉันค่อนข้างละอายใจและรู้สึกขอบคุณที่ได้ค้นพบความสามารถเหล่านั้น
Adam

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

คำอธิบายจะมาเร็ว ๆ นี้


oNoสามารถแทนที่ด้วยnTIO
ผลไม้อบแห้ง


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 coders โปรดสังเกต input_line_numberJQ เป็นวันขอบคุณพระเจ้าความรู้สึกพิเศษที่จะแสดงออกมาเพื่อ$.อะไร?
จัดการ

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'จะขึ้นบรรทัดใหม่ ระวังความจริงที่ว่ามี escape sequences อื่นด้วย ผู้ใช้'\\'ถ้าคุณไม่แน่ใจ


1

C # 6, 66 61 bytes

ขอบคุณ 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 ไม่ได้พูดถึงการเติมเต็มด้วยศูนย์ นอกจากนี้คุณยังสามารถประหยัดได้อีก 1 ไบต์โดย wirting: $ "/ * {i} * /" + l (การย้ายพารามิเตอร์ L ออกจากการแก้ไข)
CSharpie

คุณพูดถูกนะ ^^ แต่นั่นทำลาย "ความชั่วร้ายคะแนน" ของฉันฮิฮิ
สเตฟาน

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.