타임머신 quine 쓰기


21

문자열과 정수를 입력으로 받아 출력하는 프로그램을 작성하십시오 n.

  1. n몇 번 전에 프로그램에 전달 된 문자열 .
  2. 다음 호출에 사용될 새로운 프로그램.

프로그램 외부에 데이터를 저장할 수 없으며, 프로그램이 체인의 이전 프로그램을 호출 할 수 없습니다. 문자열이 존재하지 않으면 빈 문자열을 출력하십시오 (그러나 여전히 다음 프로그램을 출력하십시오).

program_n각 연속 프로그램에 대한 표기법 을 사용하는 예제 실행 (물론 [This text is the nth program]실제 코드로 대체 됨)

$ program_1 "One" 1
[This text is the second program]
$ program_2 "Two" 1
One
[This text is the third program]
$ program_3 "Three" 2
One
[This text is the fourth program]
$ program_4 "Four" 2
Two
[This text is the fifth program]
$ program_5 "Five" 1
Four
[This text is the sixth program]

새 프로그램의 코드가 문자열로 출력되어야합니까? 아니면 파일과 파일 이름 출력에 저장해야합니까?
Mego

@Mego 문자열로 출력합니다 (즉, STDOUT로). 새 프로그램을 파일로 복사하는 것을 구현할 필요는 없습니다.
압생트

"출력 없음"이란 다음 프로그램을 출력하지만 존재하지 않는 문자열을 출력한다는 의미입니까?
Mego

@Mega 네, 그게 제 뜻입니다.
압생트

program_n+1출력 줄에를 표시하는 것처럼를 추가 할 수도 있습니다 [program_3, One]. 두 출력이 모두 stdout으로 이동하면 어떻게 분리해야합니까? 전체 프로그램 대신 기능도 허용됩니까?
randomra

답변:


4

CJam, 25

L{\_l~(>1<lN+a@+`@"_~"}_~

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

설명:

L      push an empty array (this is the array of previous strings)
{…}    push this block
_      duplicate the block
~      execute the 2nd copy (the stack contains the array and the block)

블록 :

\      swap the array with the block
_      duplicate the array
l      read a line from the input (containing the integer n)
~(     evaluate n and decrement it
>      slice the array starting at that position
1<     slice the resulting array to keep only the first string (if any)
l      read the 2nd line from the input (containing the string)
N+     append a newline
a      wrap in an array
@      bring the previous array to the top
+      concatenate the arrays, thus prepending the new string
`      convert the array to its string representation
@      bring the block to the top
"_~"   push this string

마지막에 요청 된 문자열 (있는 경우), 배열 표현, 블록 및 문자열 "_ ~"가 자동으로 인쇄됩니다.


2

파이썬, 221 바이트

import sys
o,p=[''],r'import sys;a,o,p=int(sys.argv[2]),[{2},{0}],{1};print o[a] if len(o)>a else "","\n",p.format(`sys.argv[1]`,`p`,",".join(`s`for s in o))'
print '\n',p.format(`sys.argv[1]`,`p`,','.join(`s`for s in o))

이것을 쉽게 테스트하려면 ./thisgolf.py "yourfirststring" | python -c "import sys;exec(sys.stdin.read().split('\n')[1])" "your second string" <N>원하는만큼 마지막 비트를 반복하여을 사용 하십시오.


2

파이썬 2, 207 바이트

def r(O,R):import sys,marshal as m;a=sys.argv;b=int(a[2]);O.extend(["",""]*b);O[b]=a[1];print"%s\nfrom marshal import*;c=%r;i=lambda:0;i.__code__=loads(c);i(%r,i)"%(O[0],m.dumps(R.__code__),O[1:])
r([""],r)

내 다른 quine을 기반으로 하지만 프로그램을 변경 하면이 작업이 더 간단하므로 골프를 더 할 수 있습니다. 입력을 stdin으로 가져갈 수 있다면 훨씬 짧아야합니다.


0

자바 ES6, 130 128 121 120 113 바이트

a=[];b=_=>{a.push(prompt());console.log((a[a.length-prompt()-1]||"")+`
a=`+JSON.stringify(a)+";b="+b+";b()")};b()

아래로 87 : a = []; b = _ => (a.push (prompt ()), [a [a.a-alength-prompt ()-1] || "" ",`a = ‌ [$ { a}]; b = $ {b}; b ()`]); b ()
Mama Fun Roll

오. 이거요? 66 바이트입니다 : a = [], b = (x, y) => (a.push (x),`$ {a [a.length-y-1] || "" "} \ na = [$ { a}]; b = $ {b}`) _____ \n실제 개행 문자로 바꿉니다 .
Mama Fun Roll

그런 다음 a = [], b = (x, y) => (a.push (x),`$ {a [a.length-y-1] || "" "} \ na = $ {JSON.stringify (a)}; b = $ {b}`) 으로 80 바이트를 유지합니다 (물론 \ n을 바꾼 후). (여전히 REPL 스 니펫 인 내 코드에 여전히 문제가 있다면 다른 제안이 있습니다 : P).
Mama Fun Roll

마지막 몇 가지 개정판 중 일부에는 비 호환 출력 형식이있었습니다. 마지막 호환 버전으로 롤백되었습니다.
SuperJedi224
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.