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]

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.


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.


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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.