Tulis mesin waktu quine

21

Tulis sebuah program yang mengambil input string dan integer n, dan output:

  1. String yang diteruskan ke program nkali yang lalu;
  2. Program baru yang akan digunakan untuk doa berikutnya.

Anda tidak dapat menyimpan data apa pun di luar program, dan program Anda tidak dapat memanggil program sebelumnya dalam rantai. Jika string tidak ada, output string kosong (tetapi masih menampilkan program berikutnya).

Contoh run, di mana saya menggunakan notasi program_nuntuk setiap program yang berurutan (Tentu saja, [This text is the nth program]akan diganti dengan kode aktual.)

$ 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]
Absinth
sumber
Haruskah kode program baru di-output sebagai string? Atau haruskah itu disimpan ke file dan output nama file?
Mego
@Mego Output sebagai string (yaitu, ke STDOUT). Anda tidak perlu menerapkan menyalin program baru ke file.
absinthe
Dengan "output nothing", maksud Anda output program berikutnya, tetapi bukan string (tidak ada)?
Mego
@Mega Ya, itulah yang saya maksud.
absinthe
Anda juga dapat menambahkan program_n+1's ke baris output seperti [program_3, One]jika itu yang ingin Anda lihat. Jika kedua output pergi ke stdout bagaimana seharusnya mereka dipisahkan? Juga apakah fungsi diizinkan alih-alih program lengkap?
randomra

Jawaban:

4

CJam, 25

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

Cobalah online

Penjelasan:

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

Pada akhirnya, string yang diminta (jika ada), representasi array, blok dan string "_ ~" dicetak secara otomatis.

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

Untuk mengujinya dengan mudah, gunakan ./thisgolf.py "yourfirststring" | python -c "import sys;exec(sys.stdin.read().split('\n')[1])" "your second string" <N>, ulangi bit terakhir sebanyak yang Anda inginkan.

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

Dibangun pada program quine tapi perubahan saya yang lain , tugas ini lebih sederhana sehingga saya bisa bermain golf lebih jauh. Jika saya bisa mengambil input ke stdin, ini harusnya jauh lebih pendek.

Biru
sumber
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()
SuperJedi224
sumber
turun ke 87: a = []; b = _ => (a.push (prompt ()), [a [a.length-prompt () - 1] || "", `a = ‌ [$ { a}]; b = $ {b}; b () `]); b ()
Mama Fun Roll
Oh Apakah ini? Ini 66 byte: a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = [$ { a}]; b = $ {b} `) _____replace \ndengan baris baru yang sebenarnya.
Mama Fun Roll
Kemudian coba a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = $ {JSON.stringify (a)}; b = $ {b} `) , yang membuat Anda pada 80 byte (setelah mengganti \ n, tentu saja). (Jika Anda masih memiliki masalah dengan kode saya yang mungkin berupa cuplikan REPL, maka saya punya saran lain: P).
Mama Fun Roll
Beberapa revisi terakhir memiliki format output yang tidak patuh. Digulung kembali ke versi yang sesuai terakhir.
SuperJedi224