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]

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.


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.


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.


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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.