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]

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.


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.


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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.