증분 퀸


23

당신의 임무는 소스 코드의 첫 번째 문자를 출력 한 다음 두 번째, 세 번째 ...를 실행할 때마다 출력하는 프로그램이나 함수를 작성하는 것입니다.

예를 들어, 프로그램이 file의 foo언어로 barbaz.bar경우 다음과 유사한 출력이 표시됩니다.

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

이 방식으로 소스 코드 인쇄가 완료되면 프로그램에서 무엇이든 할 수 있습니다. 당신은 파일의 소스 코드를 수정할 수 있지만 인쇄 할 수있는 소스 코드가 있다는 사실을 수 있습니다 원래 소스 코드.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다.


1
파일의 소스 코드를 수정할 수 있다면 읽을 수 있다는 의미입니까?
FlipTack

1
@ Flp.Tkc 좋은 질문입니다. 나는 솔직히 모른다. 소스를 읽어서 quine을 구성하고 싶지는 않지만 파일 수정을 위해 소스를 읽는다면 괜찮습니다.
Conor O'Brien

답변:


6

젤리 , 12 바이트

“;⁾vṾ®ȯ©Ḣ”vṾ

이것은 닐라 딕 링크입니다. 온라인으로 사용해보십시오! 링크를 12 번 호출하는 코드가 포함되어 있습니다.

작동 원리

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

추가로, 12 번의 호출 후에 레지스터에 빈 문자열이 유지되므로 다시 한 번 허위이고 링크를 다시 시작할 수 있습니다. 링크를 24 번 호출하면 소스 코드가 두 번 출력되어 36 번 호출됩니다.


나는 젤리를 모른다. 그래서 바닥 글은 정확히 무엇을 하는가? 왜 ^ 17입니까?
Conor O'Brien

위의 링크 ( ¢), ID 함수 ( ¹, 첫 번째 호출 이후에는 실제로 필요하지 않음)를 호출하고 반환 값을 줄 바꿈으로 설정하고 ( , 암시 적으로 이전 반환 값을 인쇄 함) 반복하십시오. ¹그리고 모두 첨자,하지만 그들은 관련이없는거야. 나는 덜 혼란스러운 ¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(전화, 연결, 반복)으로 대체했습니다 .
Dennis

12

자바 스크립트-26 바이트

f()소스 코드를 문자별로 반환하도록 정의합니다 .

n=0;f=x=>("n=0;f="+f)[n++]

문자가 부족한 후 undefined를 반환합니다.

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness


내가 실수하지 않으면 코드의 일부로 함수 호출을 포함시켜야합니다.
Mama Fun Roll

@MamaFunRoll은 관련 메타 게시물로 연결됩니까?
Downgoat

나는 아무것도 모른다 : P 그러나, 나는 항상 함수 호출 자체가 quine의 일부라고 생각했다. 어쩌면 내가 놓친 것이 있습니까?
Mama Fun Roll

@MamaFunRoll이 사양은 특히 함수를 허용하므로 호출이 필요하지 않습니다. 어쨌든이 particylar 도전에는별로 의미가 없습니다.
Dennis

좋아, 그냥 확인
Mama Fun Roll

2

스택 된 비경쟁 형, 34 바이트

[tostr ':!' + execCounter # out]:!

표준 quine의 변형. 이것은 전체 프로그램입니다. 이것은 execCounter이 프로그램이 특정 횟수만큼 실행 된 것을 얻는 데 사용 됩니다. 모든 출력 후 오류가 발생했습니다.

여기 사용해보십시오!


2

, 31 바이트

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

익명의 기능. TIO에서 테스트하십시오!

설명

이 표준 Pip quine으로 시작하십시오.

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

이것을 중괄호로 감싸서 기능하게하십시오. 이제 전체 소스를 반환하는 대신 색인을 생성해야합니다. 인덱스에 글로벌 변수를 사용하고 매번 증가 시키면 "호출 할 때마다 다음 문자"요구 사항을 충족시킵니다. v이 (가)에 사전 초기화되었으므로 가장 적합한 후보 -1입니다. 처음으로 늘리면 0, 다음 번 1등 의 색인이 제공됩니다 .

핍은 주기적 인덱싱을 가지고 있으므로 함수가 마지막 문자를 인쇄하면 처음부터 다시 시작됩니다.


1

파이썬, 90 바이트

표준 Python quine에 대한 확장 (골프 팁 환영) :

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

이것은 python generator 함수입니다 . 즉, 반복적으로 반복하며 각 반복은 소스 코드에서 다음 문자를 제공합니다. 모든 문자가 반환되면이 오류가 발생합니다 IndexError.

테스트를 위해 다음 스크립트를 프로그램 끝에 추가하십시오.

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

또는 온라인으로 사용해보십시오!


1

*> <> , 13 21 바이트

" r:2+a1Fi1+:1F1+[ro;

\n색인을 추적하기 위해 이름 이 지정된 파일을 작성합니다.

이것은 더 골프를 칠 수는 있지만 즉시 나에게 뛰지 않는 것은 ...

산출

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

설명

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

부정 행위 증오

a1Fi1+:0go1F;

설명

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit

haha, 파일 이름을 "\ n"으로 할 수 있을지 몰랐습니다. 이것은 기술적으로 소스 코드를 읽지 만 g명령에 의해 수행 됩니다.
Conor O'Brien

@ ConorO'Brien, 아 공정한. 흠 ...
redstarcoder

*> <>에 일종의 스택 인덱싱이 있습니까? 아니면 명령 반복? 그런 다음 "your code goes here;> <>에 표준 quine 프레임 워크 를 사용한 다음 스택의 n 번째 멤버에 액세스 할 수 있습니다.
Conor O'Brien

@ ConorO'Brien 예 Teal Pelican은 저의 다른 부정 행위 퀴네 답변에이 퀴니 변종을 보여주었습니다 :).
redstarcoder

1
@redstarcoder 나는 quines (YAY!)에 대해 더 많은 일을 해왔고 r을 #으로 바꾸면 좋은 트릭을 알아 냈습니다. #; 또는 [+ 1F1 : + 1iF1a-1 : "현재 이것을 테스트 할 수는 없지만 코드에서 1 바이트를 삭감한다고 생각합니다.> <> quine은 #o <-1 :"과 같이 수행 될 수 있습니다. : D
청록 펠리컨

1

수학, 91 바이트

의견은 매우 환영합니다; 나는 여전히 어떤 quines가 적절한 quines인지에 대한 밧줄을 배우고 있습니다.

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

인수없이 반복적으로 호출되는 함수를 정의합니다. 91 번째 호출 후 큰 오류가 발생하고 평가되지 않은 상태로 반환됩니다.

극복해야 할 두 가지 문제가있었습니다. 첫째, 나는 그냥 사용 StringTake[ToString[#0]<>"[]"]하고 싶었지만 ToString[]인용 부호를 지우는 것 같습니다. 그래서로 교체해야 "[]"했습니다 FromCharacterCode[{91, 93}]. 둘째, Mathematica 변수는 초기화되지 않은 상태로 시작하므로, 정의 ++q하기 전에 호출 할 수 없습니다 q. 이것이 초기 If[!NumberQ[q], q = 0]가 필요한 이유 입니다.

관련이없는 coda : 찾고있는 동안 NumberQMathematica에는 TrueQ... 라는 함수 TrueTrue있으며 인수가 있고 False인수가 False! (유틸리티는 False다른 모든 인수에서도 리턴 합니다.)


1

마이크로 스크립트 II, 40 33 바이트

언어가 함수와 가장 가까운 코드 블록 리터럴

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

실행 한 후에는 x다시 호출하기 쉽도록 다시 설정됩니다.


0

배쉬 (및 zsh, ksh), 39 바이트

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

프로그램이 인쇄 된 후에는 아무것도 인쇄하지 않습니다.

0현재 디렉토리에 존재하지 않는지 확인 하고 다음을 실행하십시오.

bash iquine.bash

PPCG에 오신 것을 환영합니다! 인덱스를 늘리는 데 대한 영리한 아이디어가 있습니다. 불행히도이 답변은 자체 소스 코드를 읽음으로써 작동하는 것처럼 보입니다. 이는 표준에 따라 유효하지 않습니다 . 자체 소스를 읽는 것 이외의 quine 기술을 사용하도록 수정하면 좋은 대답이 될 것입니다.
DLosc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.