Escribe una máquina del tiempo quine

21

Escriba un programa que tome como entrada una cadena y un entero n, y produzca:

  1. La cadena que se pasó al programa. n hace tiempo;
  2. Un nuevo programa que se utilizará para la próxima invocación.

No puede almacenar ningún dato fuera del programa, y ​​su programa no puede llamar a programas anteriores en la cadena. Si la cadena no existe, genere una cadena vacía (pero aún genera el siguiente programa).

Ejemplo de ejecución, donde uso la notación program_npara cada programa sucesivo (Por supuesto, [This text is the nth program]sería reemplazado por el código real).

$ 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]
Ajenjo
fuente
¿Debería el código del nuevo programa salir como una cadena? ¿O debería guardarse en un archivo y la salida del nombre de archivo?
Mego
@Mego lo envía como una cadena (es decir, a STDOUT). No necesita implementar la copia del nuevo programa en un archivo.
ajenjo
Por "no generar nada", ¿quiere decir que genera el siguiente programa, pero no la cadena (no existente)?
Mego
@Mega Sí, a eso me refería.
ajenjo
También puede agregar los program_n+1's a la línea de salida como [program_3, One]si eso es lo que le gustaría ver. Si ambas salidas van a stdout, ¿cómo deberían separarse? ¿También se permiten funciones en lugar de programas completos?
randomra

Respuestas:

4

CJam, 25

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

Pruébalo en línea

Explicación:

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)

El bloque:

\      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

Al final, la cadena solicitada (si la hay), la representación de la matriz, el bloque y la cadena "_ ~" se imprimen automáticamente.

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

Para probar esto fácilmente, use ./thisgolf.py "yourfirststring" | python -c "import sys;exec(sys.stdin.read().split('\n')[1])" "your second string" <N>, repitiendo el último bit tantas veces como desee.

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

Basado en mi otra quine pero programa de cambios , esta tarea es más simple, así que pude jugar más al golf. Si pude tomar la entrada a stdin, esto debería ser mucho más corto.

Azul
fuente
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
fuente
hasta 87: a = []; b = _ => (a.push (prompt ()), [a [a.length-prompt () - 1] || "", `a = ‌ [$ { a}]; b = $ {b}; b () `]); b ()
Mama Fun Roll
Oh. ¿Sería esto? Son 66 bytes: a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = [$ { a}]; b = $ {b} `) _____replace \ncon una nueva línea real.
Mama Fun Roll
Luego intente a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = $ {JSON.stringify (a)}; b = $ {b} `) , que te deja en 80 bytes (después de reemplazar \ n, por supuesto). (Si todavía tiene un problema con mi código, posiblemente sea un fragmento REPL, entonces tengo otras sugerencias: P).
Mama Fun Roll
Algunas de las últimas revisiones tenían formatos de salida no compatibles. Retrocedió a la última versión compatible.
SuperJedi224