Napisz quine wehikułu czasu

21

Napisz program, który pobiera jako dane wejściowe ciąg i liczbę całkowitą ni wyprowadza:

  1. Ciąg, który został przekazany do programu kilka nrazy temu;
  2. Nowy program, który zostanie użyty do następnego wywołania.

Nie możesz przechowywać żadnych danych poza programem, a twój program nie może wywoływać poprzednich programów w łańcuchu. Jeśli ciąg nie istnieje, wypisz pusty ciąg (ale nadal wypisz następny program).

Przykładowy bieg, w którym używam notacji program_ndla każdego kolejnego programu (Oczywiście, [This text is the nth program]zostałby zastąpiony faktycznym kodem).

$ 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]
Absynt
źródło
Czy kod nowego programu powinien być wyprowadzany jako ciąg? A może powinien zostać zapisany do pliku i pliku wyjściowego?
Mego,
@Mego Wyprowadza go jako ciąg znaków (czyli do STDOUT). Nie musisz implementować kopiowania nowego programu do pliku.
absynt
Czy przez „nic nie wypisujesz”, masz na myśli wyjście następnego programu, ale nie ciąg (nieistniejący)?
Mego,
@Mega Tak, właśnie to miałem na myśli.
absynt
Możesz także dodać je program_n+1do linii wyjściowej, tak [program_3, One]jakbyś chciał zobaczyć to. Jeśli oba dane wyjściowe zostaną ustawione na standardowe wyjście, jak należy je rozdzielić? Czy dozwolone są również funkcje zamiast pełnych programów?
randomra

Odpowiedzi:

4

CJam, 25

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

Wypróbuj online

Wyjaśnienie:

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)

Blok:

\      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

Na końcu żądany ciąg (jeśli istnieje), reprezentacja tablicy, blok i ciąg „_ ~” są drukowane automatycznie.

aditsu
źródło
2

Python, 221 bajtów

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))

Aby to łatwo przetestować, użyj ./thisgolf.py "yourfirststring" | python -c "import sys;exec(sys.stdin.read().split('\n')[1])" "your second string" <N>, powtarzając ostatni bit tyle razy, ile chcesz.

Mego
źródło
2

Python 2, 207 bajtów

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)

Zbudowane na moim innym quine, ale zmienia program , to zadanie jest prostsze, więc mogłem grać w golfa dalej. Gdybym mógł wprowadzić dane wejściowe do standardowego wejścia, powinno to być znacznie krótsze.

niebieski
źródło
0

JavaScript ES6, 130 128 121 120 113 bajtów

a=[];b=_=>{a.push(prompt());console.log((a[a.length-prompt()-1]||"")+`
a=`+JSON.stringify(a)+";b="+b+";b()")};b()
SuperJedi224
źródło
w dół do 87: a = []; b = _ => (a.push (prompt ()), [a [a.long-prompt () - 1] || "", `a = ‌ [$ { a}]; b = $ {b}; b () `]); b ()
Mama Fun Roll
O. Czy to by było? Ma 66 bajtów: a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = [$ { a}]; b = $ {b} `) _____ zastąp \nmiejsce rzeczywistą nową linią.
Mama Fun Roll
Następnie spróbuj a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "}} \ na = $ {JSON.stringify (a)}; b = $ {b} `) , co pozostawia ci 80 bajtów (oczywiście po zamianie \ n). (Jeśli nadal masz problem z tym, że mój kod może być fragmentem REPL, mam inne sugestie: P).
Mama Fun Roll
Niektóre z ostatnich kilku wersji miały niezgodne formaty wyjściowe. Przywrócono do ostatniej zgodnej wersji.
SuperJedi224,