Schreiben Sie eine Zeitmaschine quine

21

Schreiben Sie ein Programm, das eine Zeichenfolge und eine Ganzzahl als Eingabe verwendet und Folgendes nausgibt:

  1. Die Zeichenfolge, die vor einiger Zeit an das Programm übergeben nwurde.
  2. Ein neues Programm, das für den nächsten Aufruf verwendet wird.

Sie können keine Daten außerhalb des Programms speichern und Ihr Programm kann keine vorherigen Programme in der Kette aufrufen. Wenn die Zeichenfolge nicht vorhanden ist, geben Sie eine leere Zeichenfolge aus (geben Sie aber trotzdem das nächste Programm aus).

Beispiellauf, bei dem ich die Notation program_nfür jedes nachfolgende Programm verwende ( [This text is the nth program]würde natürlich durch tatsächlichen Code ersetzt werden.)

$ 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]
Absinth
quelle
Soll der Code des neuen Programms als String ausgegeben werden? Oder soll es in eine Datei gespeichert und der Dateiname ausgegeben werden?
Mego
@Mego Gibt es als String aus (dh an STDOUT). Sie müssen das Kopieren des neuen Programms in eine Datei nicht implementieren.
Absinth
Mit "nichts ausgeben" meinen Sie, das nächste Programm auszugeben, aber nicht den (nicht existierenden) String?
Mego
@ Mega Ja, das habe ich gemeint.
Absinth
Sie können auch die program_n+1's in die Ausgabezeile einfügen, [program_3, One]wenn Sie dies wünschen. Wenn beide Ausgänge auf stdout gehen, wie sollen sie getrennt werden? Sind auch Funktionen anstelle von Vollprogrammen erlaubt?
Randomra

Antworten:

4

CJam, 25

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

Probieren Sie es online aus

Erläuterung:

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)

Der 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

Am Ende werden die angeforderte Zeichenfolge (falls vorhanden), die Darstellung des Arrays, der Block und die Zeichenfolge "_ ~" automatisch gedruckt.

aditsu
quelle
2

Python, 221 Bytes

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

Um dies einfach zu testen ./thisgolf.py "yourfirststring" | python -c "import sys;exec(sys.stdin.read().split('\n')[1])" "your second string" <N>, wiederholen Sie das letzte Bit so oft Sie möchten.

Mego
quelle
2

Python 2, 207 Bytes

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)

Aufbauend auf meinem anderen Quine-aber-Änderungsprogramm ist diese Aufgabe einfacher, so dass ich dies weiter Golf spielen konnte. Wenn ich die Eingabe auf stdin setzen könnte, sollte dies viel kürzer sein.

Blau
quelle
0

Javascript ES6, 130 128 121 120 113 Bytes

a=[];b=_=>{a.push(prompt());console.log((a[a.length-prompt()-1]||"")+`
a=`+JSON.stringify(a)+";b="+b+";b()")};b()
SuperJedi224
quelle
bis 87: a = []; b = _ => (a.push (prompt ()), [a [a.length-prompt () - 1] || "", `a = ‌ [$ { a}]; b = $ {b}; b () `]); b ()
Mama Fun Roll
Oh. Würde das? Es sind 66 Bytes: a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = [$ { a}]; b = $ {b} `) _____ \ndurch einen tatsächlichen Zeilenumbruch ersetzen.
Mama Fun Roll
Dann versuche a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||"} \ na = $ {JSON.stringify (a)}; b = $ {b} `) , wodurch Sie 80 Byte haben (natürlich nach dem Ersetzen von \ n). (Wenn Sie immer noch ein Problem damit haben, dass mein Code möglicherweise ein REPL-Snippet ist, habe ich andere Vorschläge: P).
Mama Fun Roll
Einige der letzten Überarbeitungen hatten nicht kompatible Ausgabeformate. Rollback auf die letzte kompatible Version.
SuperJedi224