Ecrire une quine de machine à remonter le temps

21

Écrivez un programme qui prend en entrée une chaîne et un entier n, et génère:

  1. La chaîne qui a été transmise au programme nil y a quelques temps;
  2. Un nouveau programme qui sera utilisé pour la prochaine invocation.

Vous ne pouvez pas stocker de données en dehors du programme et votre programme ne peut pas appeler les programmes précédents de la chaîne. Si la chaîne n'existe pas, sortez une chaîne vide (mais sortez toujours le programme suivant).

Exemple d'exécution, où j'utilise la notation program_npour chaque programme successif (Bien sûr, [This text is the nth program]serait remplacé par du code réel.)

$ 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]
Absinthe
la source
Le code du nouveau programme doit-il être sorti sous forme de chaîne? Ou doit-il être enregistré dans un fichier et la sortie du nom de fichier?
Mego
@Mego Sortez-le sous forme de chaîne (c'est-à-dire vers STDOUT). Vous n'avez pas besoin d'implémenter la copie du nouveau programme dans un fichier.
absinthe du
Par «ne rien produire», voulez-vous dire sortir le programme suivant, mais pas la chaîne (inexistante)?
Mego
@Mega Oui, c'est ce que je voulais dire.
absinthe du
Vous pouvez également ajouter le program_n+1'à la ligne de sortie comme [program_3, One]si c'était ce que vous aimeriez voir. Si les deux sorties vont à la sortie standard, comment devraient-elles être séparées? Les fonctions sont-elles également autorisées au lieu des programmes complets?
randomra

Réponses:

4

CJam, 25 ans

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

Essayez-le en ligne

Explication:

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)

Le bloc:

\      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

À la fin, la chaîne demandée (le cas échéant), la représentation du tableau, le bloc et la chaîne "_ ~" sont imprimés automatiquement.

aditsu
la source
2

Python, 221 octets

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

Pour tester cela facilement, utilisez ./thisgolf.py "yourfirststring" | python -c "import sys;exec(sys.stdin.read().split('\n')[1])" "your second string" <N>, en répétant le dernier bit autant de fois que vous le souhaitez.

Mego
la source
2

Python 2, 207 octets

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)

Construit sur mon autre programme mais change de programme , cette tâche est plus simple, j'ai donc pu jouer au golf plus loin. Si je pouvais prendre l'entrée sur stdin, cela devrait être beaucoup plus court.

Bleu
la source
0

Javascript ES6, 130 128 121 120 113 octets

a=[];b=_=>{a.push(prompt());console.log((a[a.length-prompt()-1]||"")+`
a=`+JSON.stringify(a)+";b="+b+";b()")};b()
SuperJedi224
la source
jusqu'à 87: a = []; b = _ => (a.push (prompt ()), [a [a.length-prompt () - 1] || "", `a = ‌ [$ { a}]; b = $ {b}; b () `]); b ()
Mama Fun Roll
Oh. Serait-ce? C'est 66 octets: a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = [$ { a}]; b = $ {b} `) _____remplacer \navec une nouvelle ligne réelle.
Mama Fun Roll du
Essayez ensuite a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = $ {JSON.stringify (a)}; b = $ {b} `) , ce qui vous laisse à 80 octets (après avoir remplacé \ n, bien sûr). (Si vous avez toujours un problème avec mon code pouvant être un extrait REPL, alors j'ai d'autres suggestions: P).
Mama Fun Roll du
Certaines des dernières révisions avaient des formats de sortie non conformes. Revenu à la dernière version conforme.
SuperJedi224