n-level Ouroboros Quine

11

128 bahasa ini quine ouroboros (program yang menghasilkan program dalam bahasa lain, yang menghasilkan program dalam bahasa lain, (125 bahasa kemudian), yang menghasilkan program asli) cukup mengesankan. Namun sayangnya, ia memiliki jumlah iterasi yang statis.

Tulis sebuah program yang menghasilkan suatu program (tidak harus dalam bahasa lain, tetapi bisa juga), yang menghasilkan suatu program, yang menghasilkan suatu program, dll., Yang setelah n iterasi, mengeluarkan program asli untuk pertama kalinya (yaitu tidak ada perantara program harus sama dengan yang asli, karena jika tidak quine yang mengabaikan inputnya akan bekerja), di mana n adalah integer non-negatif yang disediakan sebagai input. Input tidak boleh hanya berupa angka dalam kode sumber asli (mis. Menempatkan x = <the value of n>pada awal program Anda), itu harus salah satu dari yang berikut:

  1. Diberikan sebagai argumen baris perintah
  2. Baca dari input standar
  3. Disahkan sebagai argumen ke fungsi, yang mengembalikan / menampilkan program baru.

Untuk tahap perantara di ouroboros, program Anda dapat berupa program yang berfungsi penuh, atau fungsi tanpa argumen, yang, ketika dipanggil, akan mengembalikan / menampilkan yang berikutnya.

Anda mungkin tidak membaca dari file sumber itu sendiri, atau menggunakan builtin seperti quine (saya tidak berpikir ada yang akan melakukan ini, tetapi mungkin ada)

Agar jelas, jika n = 0, program harus menampilkan kode sumbernya sendiri.

Jika n = 1, program harus menampilkan program yang berbeda, yang menampilkan kode sumber asli.

Dan seterusnya...

Bytes paling sedikit menang!

Edit:

Saya seharusnya menulis "Untuk tahap menengah di ouroboros, program Anda bisa menjadi program yang berfungsi penuh tanpa input , atau fungsi tanpa argumen". Jika program Anda menampilkan yang berikutnya dalam rantai, lalu menunggu input, tidak apa-apa, tetapi program Anda seharusnya tidak memerlukan nilai asli n.

Leo Tenenbaum
sumber
Terkait , terkait .
Kevin Cruijssen
Bisakah kita mengindeks n? Jadi n = 1 berarti kode sumber cetak, n = 2 berarti kode cetak yang akan mencetak kode sumber, dll.
Data Kedaluwarsa
1
Apakah versi iterasi masih memiliki input awal? Jadi katakanlah input pertama saya adalah 3, dan saya menjalankan program yang dihasilkannya. Akankah masih ada input 3, atau tidak ada input sama sekali? Jika tidak ada input, saya kira kita perlu menangani bahwa jika sesuatu seperti getInput()digunakan tanpa input yang disediakan. Atau bisakah kita katakan masukan sesuatu acak yang tidak digunakan untuk iterasi selanjutnya, untuk mencegah kesalahan getInput()? Aka apakah jawaban Python saat ini valid?
Kevin Cruijssen
Saya menduga bahwa apa yang diminta untuk dilakukan adalah, diberi bilangan bulat n, menampilkan program yang merupakan "program awal" dari quine itoboros kami dari niterasi, dan bahwa jawaban kami tidak boleh dihitung sebagai salah satu niterasi. Apakah ini benar?
Erik the Outgolfer
@KevinCruijssen Saya mungkin seharusnya lebih jelas tentang itu. Tahap perantara tidak dapat memiliki input dalam bentuk apa pun. Saya kira jika program mengeluarkan yang berikutnya dan kemudian menunggu input, itu akan baik-baik saja.
Leo Tenenbaum

Jawaban:

5

05AB1E , 28 byte

-4 byte + perbaiki terima kasih kepada Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ì

Cobalah online!


Penjelasan

Ini berfungsi dengan menambahkan nomor yang tersisa untuk dicetak ke depan kode, yang berarti ditambahkan ke tumpukan dengan cara yang sama seperti input. Dalam kasus dasar input "0" tidak akan menyatukan 0 di bagian depan.

Data Kedaluwarsa
sumber
dadalah non-negatif ( >=0) bukan positif ( >0). Masalahnya adalah bahwa untuk mengecek dtanpa memunculkannya, Anda harus menduplikat terlebih dahulu, tetapi kemudian juga harus dibuang pada iterasi 0"quinsting", jika tidak maka akan menghasilkan duplikat 0. :(
Kevin Cruijssen
"34çìD«s<©di®ì"34çìD«s<©di®ìuntuk 28 byte mungkin (yang masih cukup dekat dengan pendekatan yang Anda maksudkan)? (Saya khawatir versi Anda saat ini untuk 0"34çìD«s<Ddiì"34çìD«s<Ddiìoutput iterasi -1dari Duplicate ..)
Kevin Cruijssen
4

Pesona Rise , 39 byte

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

Cobalah online!

Akan 4 byte lebih pendek dari 05AB1E menggunakan taktik yang sama jika inputnya kurang dari atau sama dengan 10. Tetapi karena kita perlu mendukung nilai-nilai besar yang sewenang-wenang, itu menjadi lebih rumit.

Nilai numerik nditempatkan di bagian depan dan diuraikan sebagai bilangan literal berkelanjutan ´. "3X4+kSqadalah kode quine dasar. Jika tidak ada nilai di depan, panjang tumpukan hanya akan menjadi 1 (quine) jika tidak 2 membiarkan l1=d*?menentukan bagaimana menangani hal-hal dari sana.

  • Jika ada nilai, S:1-}'LA2+-}jalankan: tukar nilai ke atas, kurangi 1, gandakan, tinggalkan salinan di bagian bawah tumpukan, dapatkan Log 10 dari nilai itu dikali 100 (menghasilkan panjang karakter nilai sendiri, ditambah 1 untuk ´), hapus banyak karakter dari ujung string (secara efektif memotong sendiri dari ujung, baik di mana tidak diperlukan dan karena memiliki nilai yang salah). Clebih pendek satu byte dari 2+dan menghasilkan nilai yang sama.

  • Jika tidak ada nilai, baca satu dari input.

Apapun: :0)2*?duplikat dan bandingkan dengan nol.

  • Jika push bukan nol ´.

  • Jika nol, angkat nilainya. Kita bisa curang menggunakan !alih-alih 2?dan menyimpan byte karena ketika ´mencoba mengeksekusi byte pertama yang dilihatnya adalah non-numerik dan segera keluar dari mode angka pada posisi yang sama.

Cetak seluruh tumpukan dari atas ke bawah.

Draco tidak lagi percaya pada SE
sumber
3

Java 10, 145 byte

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

Cobalah secara online dan lihat output dari beberapa iterasi .

Penjelasan:

penjelasan :

  • Ini var sberisi kode sumber yang tidak diformat
  • %s digunakan untuk menempatkan String ini ke dalam dirinya dengan s.format(...)
  • %c,, %1$cdan 34digunakan untuk memformat tanda kutip ganda
  • s.format(s,34,s) menempatkan semuanya bersama-sama

Bagian tantangan:

Fungsi lambda pertama mengambil longinput sebagai parameter.

  • Ini diatur dalam variabel Long N=n;dalam iterasi pertama. Atau Long N=%s;untuk iterasi selanjutnya.
  • Pemeriksaan ternary N>0?N-1+"L":"n"akan mengisinya %sdengan nilai N-1, ditambahkan dengan Lkarena ini panjang dan untuk mengubahnya menjadi String untuk %s, jika Nlebih besar dari 1. Jika Nsebaliknya 0 (input awal adalah 0atau ini adalah iterasi terakhir dari interquine- ' loop '), ini akan mengisinya %sdengan inisial n.
Kevin Cruijssen
sumber
Spec mengatakan output antara harus program penuh atau fungsi tanpa argumen
Perwujudan Ketidaktahuan
@EmbodimentofIgnorance Saya tahu, itulah yang saya miliki. Fungsi lambda pertama mengambil longparameter-fungsi, dan fungsi lambda lainnya mengambil parameter yang tidak digunakanVoid , yang saya juga selalu gunakan untuk tantangan yang menyatakan tidak mengambil input karena v->1 byte lebih pendek dari ()->.
Kevin Cruijssen
2

Haskell , 195 164 bytes

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

Cobalah online!

Ini menggunakan teknik quine yang cukup sederhana. Kami memodifikasinya dengan variabel ayang diatur ke angka. Jika angka itu nol (yang merupakan awal) kami mengambil input dan output sumber kami dengan aset ke nomor input. Jika atidak nol, kami mengeluarkan sumber kami dengan aset ke satu lebih sedikit. Cara ini amenghitung mundur ke nol sebelum mengeluarkan sumber aslinya.

Ad Hoc Garf Hunter
sumber
2

R , 92 byte

f=function(n=-1){gsub("\\s","",paste("f=",sub("-?\\d+",n-1,paste(deparse(f),collapse=""))))}

Cobalah online!

Jika deparsedianggap curang, berikut ini alternatifnya:

R , 108 byte

function(n=-1){s="function(n=%d){s=%s%s%2$s;sprintf(s,n-1,intToUtf8(34),s)}";sprintf(s,n-1,intToUtf8(34),s)}

Cobalah online!

Nick Kennedy
sumber
1

Perl 6 , 44 byte

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

Cobalah online!

Mengambil input melalui input standar dan mengembalikan program di mana satu-satunya hal yang berubah adalah angka pertama. Setiap program selanjutnya akan menampilkan program yang sama, kecuali dengan jumlah yang dikurangi.

Jo King
sumber
1

C # (Visual C # Interactive Compiler) , 112 byte

void f(int n=-1){var s="void f(int n={2}){{var s={0}{1}{0};Write(s,(char)34,s,n-1);}}";Write(s,(char)34,s,n-1);}

Menyimpan banyak byte berkat @NickKennedy!

Cobalah online!

Perwujudan Ketidaktahuan
sumber
Output antara bukanlah program lengkap atau fungsi yang mengambil argumen tunggal. Juga saya pikir Anda memiliki beberapa nyang seharusnya l. Bagaimana dengan tio.run/##Sy7WTS7O/P@/…
Nick Kennedy
1

Python 3.8 (pra-rilis) , 60 56 55 53 byte

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

Cobalah online!

-2 byte terima kasih kepada Jo King

Pada versi 53 byte, juga berfungsi di Python 2 dan Python 3.

negatif tujuh
sumber
Fungsi perantara sepertinya bukan program penuh atau fungsi yang tidak membutuhkan argumen.
Nick Kennedy
Operator walrus itu :=adalah tambahan selamat datang untuk Python, itu sudah pasti.
mbomb007
"Untuk tahap perantara di ouroboros, program Anda dapat berupa program yang berfungsi penuh, atau fungsi tanpa argumen , yang, ketika dipanggil, akan mengembalikan / menampilkan yang berikutnya."
mbomb007
@NickKennedy Diperbarui untuk mematuhi spesifikasi, dan secara kebetulan menyimpan 4 byte.
negatif tujuh
1
53 byte tanpa menggunakan:=
Jo King