Bir zaman makinesi quine yaz


21

Bir dize ve tamsayı olarak girdi alan nve çıktısını alan bir program yazın :

  1. Programa ndefalar önce geçen dize ;
  2. Bir sonraki çağrı için kullanılacak yeni bir program.

Programın dışında hiçbir veri depolayamazsınız ve programınız zincirdeki önceki programları çağıramaz. Dizge mevcut değilse, boş bir dizge çıktı (ancak bir sonraki programa yine de çıktı).

program_nHer art arda program için gösterimi kullandığım örnek çalışma (Tabii ki, [This text is the nth program]gerçek kodla değiştirilecektir.)

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

Yeni programın kodu bir dize olarak mı verilmelidir? Veya bir dosyaya ve dosya adı çıktısına kaydedilmeli mi?
Mego

@Mego Dizge olarak çıktılar (yani, STDOUT). Yeni programı bir dosyaya kopyalayarak uygulamanıza gerek yoktur.
pelin otu

"Çıktı hiçbir şey" ile, bir sonraki programın çıktısını mı kastediyorsunuz (olmayan) dizgisini değil?
Mego

@Mega Evet, demek istediğim buydu.
absinthe

Ayrıca , görmek istediğiniz şey buysa program_n+1, çıkış satırına 's' ekleyebilirsiniz [program_3, One]. Her iki çıktı da stdout'a giderse, bunlar nasıl ayrılmalıdır? Ayrıca tam program yerine fonksiyona izin veriliyor mu?
randomra

Yanıtlar:


4

CJam, 25

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

Çevrimiçi deneyin

Açıklama:

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)

Blok:

\      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

Sonunda, istenen dize (varsa), dizinin gösterimi, blok ve "_ ~" dizesi otomatik olarak yazdırılır.


2

Python, 221 bayt

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

Bunu kolayca test etmek için ./thisgolf.py "yourfirststring" | python -c "import sys;exec(sys.stdin.read().split('\n')[1])" "your second string" <N>, son biti istediğiniz kadar tekrarlayarak kullanın .


2

Python 2,207 bayt

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)

Diğer quine'm üzerine inşa edildi ancak programı değiştirdi , bu görev daha kolay, bu yüzden daha fazla golf yapabildim. Eğer girdiyi stdin'e alabilseydim, bu çok daha kısa olmalıydı.


0

Javascript ES6, 130 128 121 120 113 bayt

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

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

Ah. Bu olur mu? 66 bayt: a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = [$ { a}]; b = $ {b} `) _____ \ngerçek bir newline ile değiştir.
Mama Fun Roll

Sonra bir = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = $ {JSON.stringify (a)}; b = $ {b} `) , bu sizi 80 bayta bırakır (elbette \ n'yi değiştirdikten sonra). (Kodumun muhtemelen bir REPL pasajı olmasıyla ilgili hala bir sorununuz varsa, başka önerilerim var: P).
Mama Fun Roll,

Son birkaç revizyonun bazıları uyumlu olmayan çıktı formatlarına sahipti. Son uyumlu sürüme geri alındı.
SuperJedi224
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.