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]

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.


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.


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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.