Scrivi una macchina del tempo


21

Scrivi un programma che accetta come input una stringa e un numero intero ne genera:

  1. La stringa che è stata passata al programma nqualche tempo fa;
  2. Un nuovo programma che verrà utilizzato per la prossima chiamata.

Non è possibile memorizzare alcun dato al di fuori del programma e il programma non può chiamare i programmi precedenti nella catena. Se la stringa non esiste, genera una stringa vuota (ma continua a produrre il programma successivo).

Esempio di esecuzione, in cui utilizzo la notazione program_nper ciascun programma successivo (Naturalmente, [This text is the nth program]verrebbe sostituito con il codice effettivo.)

$ 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]

Il codice del nuovo programma dovrebbe essere emesso come una stringa? O dovrebbe essere salvato in un file e l'output del nome file?
Mego,

@Mego Output in una stringa (cioè in STDOUT). Non è necessario implementare la copia del nuovo programma in un file.
assenzio

Per "output nulla", intendi output il programma successivo, ma non la stringa (inesistente)?
Mego,

@Mega Sì, questo è ciò che intendevo.
assenzio

Potresti anche aggiungere program_n+1"s" alla linea di output come [program_3, One]se fosse quello che vorresti vedere. Se entrambi gli output vanno allo stdout, come dovrebbero essere separati? Sono consentite anche le funzioni anziché i programmi completi?
randomra,

Risposte:


4

CJam, 25

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

Provalo online

Spiegazione:

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)

Il blocco:

\      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

Alla fine, la stringa richiesta (se presente), la rappresentazione dell'array, il blocco e la stringa "_ ~" vengono stampati automaticamente.


2

Python, 221 byte

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

Per testarlo facilmente, usa ./thisgolf.py "yourfirststring" | python -c "import sys;exec(sys.stdin.read().split('\n')[1])" "your second string" <N>ripetendo l'ultimo bit tutte le volte che vuoi.


2

Python 2, 207 byte

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)

Costruito sulle mie altre quine ma cambia programma , questo compito è più semplice, quindi sono stato in grado di giocare a golf ulteriormente. Se fossi in grado di portare l'input su stdin, questo dovrebbe essere molto più breve.


0

Javascript ES6, 130 128 121 120 113 byte

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

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

Oh. Sarebbe questo? Sono 66 byte: a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = [$ { a}]; b = $ {b} `) _____sostituisci \ncon una nuova riga effettiva.
Mama Fun Roll

Quindi prova a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = $ {JSON.stringify (a)}; b = $ {b} `) , che ti lascia a 80 byte (dopo aver sostituito \ n, ovviamente). (Se hai ancora problemi con il mio codice che potrebbe essere uno snippet REPL, allora ho altri suggerimenti: P).
Mama Fun Roll

Alcune delle ultime revisioni avevano formati di output non conformi. Ripristinato all'ultima versione conforme.
SuperJedi224,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.