/ * 줄 번호 주석 생성 * /


12

작업은 문자열을 입력으로 사용하고 다음 규칙을 만족하는 모든 줄의 시작 부분에 텍스트를 추가하는 프로그램 (또는 함수)을 작성하는 것입니다.

  • 추가 된 텍스트는 줄 번호를 포함해야합니다. 0 또는 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
주석을 언어에 따라 만들면 상황이 복잡해집니다. 이미 파이썬에 대한 특별한 규칙을 만들어야했습니다. 여러 줄 주석이없는 다른 모든 언어는 어떻습니까? 전혀 의견이없는 언어는 어떻습니까? 부작용없이 주석을 넣을 수없는 여러 줄 문자열은 어떻습니까?
Dennis

4
재미있는 사실 : "주석을 제거하면 프로그램을 변경해서는 안된다"라는 규칙은 주석을 포함한 코드가 런타임에 검사 될 수 있기 때문에 모든 파이썬 응답을 즉시 실격시킵니다. 프로덕션 시스템에서 이것을 보았습니다 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와 줄로 선언 합니다. 추가 바이트는 개행 opcode가 시작되어 추가 항목을 인쇄하지 못하게하는 데 사용됩니다.


16

펄, 8 + 1 = 9 바이트

say"#$."

-p(1 바이트 페널티)로 실행하십시오 . (PPCG 규칙에 익숙하지 않은 사람들에게 참고하십시오. 또한을 사용하여 최신 버전의 Perl 구문을 지정해야 -M5.010하지만 언어 버전을 선택하는 옵션은 무료이며 바이트 페널티는 발생하지 않기로 결정했습니다. 이 게시물의 원본 버전)

-p프로그램을 암시 적 루프에 배치합니다. 기본적으로 프로그램이 각 행을 개별적으로 처리하는 필터가됩니다 (즉, 전체 프로그램이 첫 번째 행, 두 번째, 세 번째 등에서 실행 됨). Perl은 또한 $.몇 줄의 입력을 읽었는지 기록하는 행 번호를 추적 합니다. 프로그램의 모든 작업은 -p입력 라인을 읽도록하는 것입니다. a #, 현재 줄 번호 ( $.) 및 줄 바꿈을 출력합니다 ( say기본적으로 줄 바꿈을 추가합니다.이 경우에 도움이되며 더 일반적으로 보이는 것보다 짧습니다 print). 그런 다음 -p읽은 원래 코드 줄 (일반적으로-p입력에 대해 일종의 처리를 수행하지만 우리가하지 않았기 때문에 출력이 변경되지 않았습니다). Perl의 주석은 #개행 문자로 실행됩니다 ( #프로그램 자체는 문자열 리터럴 안에 있기 때문에 주석을 시작하지 않습니다). 기본적으로 수행하는 작업은 처리 할 때 주석 행을 파일에 쓸 수있는 기회를 얻는 것입니다 의 "자연적인"읽기 및 쓰기주기를 방해하지 않습니다 -p.


이것이 어떻게 작동하는지 설명 할 수 있습니까?
Adám

확실한. 나는 언어의 힘을 많이 사용하지 않는 매우 기본적인 Perl 프로그램이기 때문에 튜토리얼 스타일로 관련 Perl 언어 기능의 작동을 설명했습니다. 그러나 모든 사람들이 -p루프 또는 자동 업데이트 라인 번호 가 어떻게 작동하는지 아는 것은 아닙니다 .

참고 say"$.;"문제는 그 지정하기 때문에, 잘 작동은 "당신은 코드의 모든 문은 기껏해야 1 개 라인의 전체를 차지한다고 가정 할 수있다."
msh210

그러나 그것은 실제로는 주석이 아닙니다. 유용하지는 않지만 AST로 끝납니다 (Perl의 옵티마이 저는 짜증이 나기 때문에 실제로 프로그램을 느리게 할 것이라고 생각합니다.

규칙에 맞지 않음 공백과 주석 만 포함 된 줄에 줄 번호를 넣을 필요는 없습니다.
Denis Ibaev

9

자바 스크립트, 43 39 바이트

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

4 바이트를 절약 해 준 ETH와 Conor에게 감사합니다.


41 바이트 : a => (b = 0, a.replace (/ ^ / gm, _ => /*${++b}*/)) (포맷 문자열 사용)
Conor O'Brien

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

루아, 80 75 바이트

언어를 남용하여 바이트를 절약했습니다.

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

충분히 간단한 스타터 답변.

언 골프, +

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]].
Esolanging 과일

1
오, 나는 그 규칙을 눈치 채지 못했습니다. 그것은 보인다 ... 약간 중복 ...
ATaco

1
예. 어쩌면 내가 제거 할 것입니다 ... [편집] : 제거되었습니다.
Esolanging Fruit

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=3됩니다 c:=1;:e=3.

다행히 Gema에는 네임 스페이스의 일종 인 도메인 이 있습니다. 위의 코드는 우리가 절대 사용하지 않는 네임 스페이스 c의 더미 규칙을 정의합니다. 불행히도 언급 된 도메인은 줄이 끝날 때까지 유효하므로 기본 도메인으로 명시 적으로 전환해야합니다.

Gema, 18 자

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

로 변환 e=3됩니다 1=$0;e=3.

덜 복잡한 대안은 무시되는 코드 대신 효과가없는 코드를 사용하는 것입니다. 나는 정확히 일치하는 것을 되돌려 놓아야합니다.


그러나 문자열을 삽입하고 그 주위에 코드를 두어 그것을 무시하게 만들 수 없었습니까?
Adám

당신은 현재 대신에 어떤 종류의 e=3변형을 의미 합니까? 예, 19 자 길이의 해결 방법이 있습니다. if (false) { 1 }; e=3!1␤e=3
manatwork

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을 사용한 이후로 오랜 시간이 지났지 만 프로그램 텍스트를 줄 번호가 아닌 주석으로 만들지 않습니까? 아니면 내가 잘못 기억하고 있습니까?

입력 주셔서 감사합니다! 실제로, '는 단지 다음 줄을 언급합니다.
anonymous2

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 바이트 : 두 개의 13 바이트 솔루션에 대한 @manatwork 덕분에 신용 및 감사

으로 1하는 액션 기본값 print $0:

{print"#"NR}1

또는 $0내용 을 교체하여

$0="#"NR RS$0

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

@manatwork 나는 그 부조화를 발견하는 것이 매우 부끄럽고 감사합니다
Adam

2

코 틀린 확장 기능, 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}/

곧 설명하겠습니다.


oNonon TIO 로 교체 할 수 있습니다 .
Esolanging 과일

1

Mathematica, 58 바이트

i = 1; StringReplace[#, StartOfLine :> "(*" <> ToString@i++ <> "*)"] &

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 's를 참조하십시오 input_line_number. 추수 감사절을 표현할 특별한 느낌이 $.있습니까?
manatwork

1

GolfScript, 23 바이트

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

"#"으로 시작하는 줄 설명 만 있습니다.

언 골프 드 & 설명 :

           # 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
op는 이후 64로 0으로 채워진 패딩을 언급하지 않았기 때문에 기술적으로 64입니다. 또한 $ "/ * {i} * /"+ l을 사용하여 1 바이트를 더 절약 할 수 있습니다. (보간에서 L- 파라미터 이동)
CSharpie

당신은 맞습니다 ^^ 그러나 그것은 나의 "악마 점수"hehe를 파괴합니다
Stefan

0

파이썬 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.