Periode iterasi terpanjang quine

10

Seperti kita ketahui, quine adalah program yang menampilkan kode sumbernya sendiri. Namun, mungkin juga untuk menulis program yang menghasilkan program lain yang berbeda, yang menghasilkan lagi program pertama. Misalnya, program Python 2

x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3

akan, ketika dijalankan, menampilkan teks berikut:

print """x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3"""

Ketika dijalankan sebagai program Python, ini akan menampilkan kode asli lagi. Ini disebut quine iterating . Karena Anda harus menjalankannya dua kali untuk mendapatkan kode asli kembali, kami katakan itu memiliki periode 2 . Tapi tentu saja, periode yang jauh lebih tinggi dimungkinkan.

Tantangan Anda adalah menulis quine iterating dengan periode yang Anda bisa, dalam 100 byte atau kurang , dalam bahasa pilihan Anda. (Perhatikan bahwa contoh saya di atas tidak sesuai dengan spesifikasi ini, karena 119 byte, termasuk baris tambahan.)

Harap perhatikan aturan dan klarifikasi berikut:

  • Aturan quine yang biasa berlaku, yaitu program Anda tidak dapat menggunakan fitur bahasa yang akan membiarkannya mengakses kode sumbernya sendiri secara langsung.
  • Keluaran yang di-iterasi akhirnya harus kembali ke kode asli Anda, dan Anda harus menyertakan demonstrasi atau bukti bahwa itu akan.
  • Anda juga harus memasukkan penjelasan mengapa siklus itu selama Anda mengatakannya. Ini tidak harus pada tingkat bukti matematika, tetapi harus meyakinkan seseorang yang terbiasa dengan bahasa Anda. (Aturan ini ada di sini karena saya berharap beberapa jawaban melibatkan jumlah yang sangat, sangat besar.)
  • Tidak apa-apa untuk mengatakan sesuatu seperti "setidaknya 1.000.000 iterasi" daripada memberikan angka pastinya, selama Anda dapat membuktikan bahwa itu setidaknya selama itu. Dalam hal ini, skor Anda adalah 1.000.000. Kalau tidak, skor Anda adalah periode quine Anda.
  • Batas 100 byte hanya berlaku untuk program awal Anda - program yang dihasilkannya bisa lebih lama, meskipun tentu saja mereka akhirnya harus kembali ke 100 byte untuk mengeluarkan kode asli Anda.
  • Anda dapat mengasumsikan mesin Anda memiliki RAM tak terbatas dan runtime tak terbatas, tetapi Anda tidak dapat mengasumsikan tipe data presisi tak terbatas (seperti bilangan bulat) jika bahasa Anda tidak memilikinya. Anda dapat mengasumsikan tidak ada batasan panjang input yang dapat ditangani parser Anda.
  • Skor tertinggi menang.

Harap dicatat: ada tantangan yang disebut Quit Whining; Mulai Quining yang juga melibatkan queri iterasi. Namun, selain didasarkan pada konsep yang sama, ini adalah jenis tantangan yang sama sekali berbeda. Yang lain adalah kode lurus golf, sedangkan yang satu ini (sengaja!) Benar-benar masalah berang-berang yang disamarkan. Teknik yang diperlukan untuk menghasilkan jawaban yang baik untuk pertanyaan ini cenderung sangat berbeda dari apa yang dibutuhkan untuk menjawab pertanyaan lain, dan ini sangat banyak dengan desain.

Nathaniel
sumber
1
@ LeakyNun Saya tidak tahu apakah itu Anda atau mod yang menghapus jawaban Anda, tetapi mungkin jika saya menjelaskan apa yang salah dengan itu, Anda akan mengerti mengapa ini bukan duplikat. Pertanyaan ini menentukan batas 100 byte pada panjang sumber, sehingga Anda sebenarnya tidak bisa "setinggi yang Anda inginkan" menggunakan metode itu. Itulah inti dari pertanyaan ini. Untuk menjawabnya, apa yang harus Anda lakukan adalah memposting versi terpanjang yang sesuai dengan 100 karakter, dan mengatakan apa periode itu. Apa yang Anda posting akan menjadi upaya pertama yang baik tetapi sangat tidak mungkin untuk menjadi pemenang.
Nathaniel
1
@Dave tantangannya adalah tentang menentukan sejumlah besar dalam sejumlah kecil byte, ya. Itulah keseluruhan prinsip di mana ia dirancang. Pertanyaannya adalah, apakah 3 ^^^ 3 angka tertinggi yang dapat Anda tentukan dalam 100 byte dalam bahasa Anda, atau ada yang lebih besar? Itulah tantangannya. Itulah intinya. Itu yang ingin kulihat dilakukan orang. Itu super, super frustasi untuk membuatnya ditutup berdasarkan kemiripan dangkal dengan tantangan yang tidak memiliki struktur ini.
Nathaniel
1
@Dave (komentar kedua) tetapi jika Anda pintar, Anda tidak perlu dibatasi oleh presisi mesin sama sekali. Saya berharap jawaban kompetitif memiliki periode lebih lama dari 2 ^ (2 ^ 64).
Nathaniel
3
Jadi, apakah Anda lebih suka ditutup sebagai duplikat codegolf.stackexchange.com/q/18028/194 ?
Peter Taylor
1
@PeterTaylor itu adalah tema yang jauh lebih dekat, tetapi ini masih merupakan tantangan yang sangat berbeda - mencetak angka sangat berbeda dari melakukan sesuatu dalam jumlah besar. Tentu saja saya lebih suka tidak ditutup sama sekali.
Nathaniel

Jawaban:

10

PHP, periode 2.100.000.000

Siapa yang mengira ini mungkin di PHP ?! :-)

Ini sebenarnya quine pertama saya dan panjangnya 99 byte:

<?$i=1;$i*=21e8>$i;printf($a='<?$i=%d;$i*=21e8>$i;printf($a=%c%s%c,++$i,39,$a,39);',++$i,39,$a,39);

Meskipun PHP mendukung angka yang lebih besar daripada 2 * 10^8dengan beralih dari integerke double, peningkatannya tidak lagi berfungsi (mengarah ke loop tak terbatas) dan saya belum menemukan solusi lain yang cocok dengan 100 byte. Namun.

Bukti cukup sederhana, karena hanya menghitung pada setiap iterasi hingga mencapai titik reset pada 2,1 miliar.

Kredit untuk dave , yang memposting pendekatan dalam kode semu di komentar dan untuk Bob Twells , dari siapa saya menyalin kode untuk PHP quine minimal.

Program uji (sloooooow):

<?php
$o = file_get_contents('quine.php');
for ($i = 0; $i < 22e8; $i++) {
    if ($i%2==0) exec('php q > p'); else exec('php p > q');
    $a = file_get_contents(($i%2==0) ? 'p' : 'q');
    echo "\r" . str_pad($i,6,' ') . ":\t$a";
    if ($a == $o) {
        die;
    }
}

Yah, setidaknya aku yang pertama menjawab.

YetiCGN
sumber
1
Catatan: Ini ada di urutan ~ 10 ^ 9.322219295.
LegionMammal978
8

Mathematica, periode E8.5678 # 3 E2.1923 # 4 ~ E6.2695 # 3 # 2

Print[ToString[#0, InputForm], "[", #1 - 1 /. 0 -> "Nest[#!,9,9^9^99!]", "]"] & [Nest[#!,9,9^9^99!]]

Perhatikan bahwa skor dijelaskan dalam notasi Hyper-E . Iterasi menggantikan final Nest[#!,9,9^9^99!]dengan ekspansi desimal dari Nest[#!,9,9^9^99!]- 1, Nest[#!,9,9^9^99!]- 2, Nest[#!,9,9^9^99!]- 3, ..., 3, 2, 1, dan kembali ke Nest[#!,9,9^9^99!].

LegionMammal978
sumber
bukankah faktorial akan tumbuh lebih cepat?
Maltysen
1
Saya tidak tahu Mathematica, tetapi bukankah ini merupakan pelanggaran aturan untuk quine - membaca kode sumbernya sendiri? ToString[#0, InputForm]
daniero
jadi, baru 9 !!!! tidak bekerja? idk cuz saya tidak memiliki RPI Mathematica saya dengan saya sekarang.
Maltysen
@Maltysen Yang menghitung faktorial ganda dari faktorial ganda sembilan, atau (9 !!) !! ≈ 2.116870635 · 10¹²⁰²
LegionMammal978
@daniero Maksudku, idenya mirip dengan CJam standar {"_~"}_~, jadi saya kira itu harus valid ...
LegionMammal978
5

R, periode acak dengan harapan 2 ^ 19936-0.5

f=function(){
    options(scipen=50)
    body(f)[[4]]<<-sum(runif(623))
    0
    cat("f=")
    print(f)
}

Generator angka acak default R memiliki periode 2 ^ 19937-1 dan pemerataan dalam 623 dimensi berurutan. Dengan demikian, suatu tempat (tetapi hanya sekali) dalam periode akan menjadi vektor panjang nol-623. Ketika kami sampai di sana (dan disejajarkan dengan awal urutan) jumlah dari 623 acak U [0,1] angka berikutnya akan menjadi nol dan kami kembali ke program asli kami.

Perhatikan bahwa program akan dengan probabilitas sangat tinggi melewati kondisi tidak nol yang sama beberapa kali sebelum kembali ke nol. Misalnya, jumlah 311.5 adalah yang paling mungkin, dan ada banyak cara yang bisa terjadi, tetapi RNG memungkinkan periode untuk 0 lebih lama dari periode untuk 311.5.

JDL
sumber
Tidak yakin skor apa yang ingin Anda berikan pada entri ini: P
JDL
1
Sesuai aturan: "Tidak apa-apa untuk mengatakan sesuatu seperti" setidaknya 1.000.000 iterasi "daripada memberikan angka pastinya" Jadi menurut saya itu "setidaknya 1 iterasi" karena jika kita mendapatkan reeeally beruntung pada percobaan pertama ...;)
YetiCGN
Tidak seperti banyak celah standar seperti "Saya mungkin menghasilkan beberapa input acak, jawabannya ada di sana", ini adalah bukti yang sangat rapi bahwa jawaban pasti pasti akan terjadi, dan perkiraan yang sangat baik diberikan. Bagus!
Andreï Kostyrka
1
Setelah program kembali ke kondisi dasar sekali, maka program akan memiliki periode non-acak tepat 2 ^ 19937-1.
JDL
Output dari ini tidak cocok dengan program yang sebenarnya (ada sedikit spasi yang hilang). Selain itu, negara tidak akan disimpan di antara panggilan program, sehingga periode tidak akan menjadi angka yang tepat, juga tidak akan konsisten
Jo King
1

JavaScript, periode 9.007.199.254.700.000

Tidak akan menang, tapi menyenangkan bekerja dengan JavaScript untuk tantangan ini:

a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)

Mengikuti siklus berikut:

a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254700000-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254699999-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254699998-1||90071992547e5)
// etc...
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),3-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),2-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254700000-1||90071992547e5)
// and so on

Catatan: Anda bisa membuatnya lebih pendek 18 byte, sementara hanya menghapus ~ 0,08% dari skor, seperti:

a="a=%s;console.log(a,uneval(a),%.0f-1||9e15)";console.log(a,uneval(a),1-1||9e15)
Produksi ETH
sumber
1

C, periode 2.100.000.000

unsigned long long i;main(a){i=1;i*=21e8>i;printf(a="ungisned long long i;main(a){i=%d;i*=21e8>i;printf(a=%c%s%2$c,++i,34,a);}",++i,34,a);}

Didasarkan pada jawaban PHP (jelas). Akan memperbarui dengan penjelasan ketika saya punya waktu.

MD XF
sumber
1

C (gcc) , 66 byte, periode 2 ^ 64

f(s){printf(s="f(s){printf(s=%c%s%1$c,34,s,%lu+1L);}",34,s,0+1L);}

Cobalah online!

2 ^ 64 angka tersedia dalam unsigned longbilangan bulat. Oleh karena itu, periode 2 ^ 64.

SS Anne
sumber
1

Python 2

9((99↑↑(9((99↑↑(9((99↑↑(9↑↑5-1))9)-1))9)-1))9)+1

99(99↑↑12)+1

b=0;s="print'b=%d;s=%r;exec s'%(-~b%eval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9))),s)";exec s

Cobalah online!

Dalam kode b=0perubahan untuk b=1saat itu b=2dan seterusnya sampai mencapai b=decimal expansion of the periodkemudian kembali keb=0

Mukundan
sumber
1
9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9jauh lebih tinggi daripada 9**9**99**99**99**99**99**99**99**99**99**99**99**99. Yang mengatakan, Anda bisa melakukan sesuatu seperti eval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9)))untuk nomor JAUH jauh lebih tinggi.
Bubbler
Apa arti peroid?
SS Anne
@SSAnne ditulis dalam notasi panah atas Knuth
Mukundan
1
@ Mukundan Saya pikir Anda mungkin berarti titik tapi saya tidak yakin. Saya mengerti apa itu tetrasi.
SS Anne
@SSAnne maaf itu salah ketik, terima kasih telah menunjukkannya
Mukundan
0

Gol> <> , 70 byte, periode 325883196621297064957600206175719056476804879488288708188003274919860959534770101079512433396348062803055739640225395758790852315876868469390603793729639715908136196505908165227136154287969475839017544811926036808089596209081885772040898530121921794489026069641113281250

Bijaksana lain yang dikenal sebagai sangat besar (3.25E270)

":1=l8:*6+=S&Q~:'~'=Q~~'H#'||lPffXfX=?1:1=Q$~$~|:1)lPffXfX(Q?:|r2ssH##

Ini sebenarnya adalah versi jawaban yang saya ubah pada iterator 500 byte

":1=l8:*6+=S&Q~:'~'=Q~~'H#'||//if last is equal to 1 and length is 71, delete the delete char, if the last char is '~', delete and push 'H#', which will later return to 'H##', completing the cycle!
lPffXfX=?1:1=Q$~$~|          //if length is equal to 15^15^15, then start delete process(append ascii one)
:1)lPffXfX(Q?:|              //if the last character is not 1 (the delete checker), and length is less than 15^15^15, duplicate the last value and append
r2ssH##                      //push the " to the front and output the whole thing

Semoga skor saya tepat, dan tidak ada bug. Tidak ada cara nyata untuk benar - benar menghitung nilai ini, ini teoretis. Tapi kawan, itu jumlah yang besar !!!

Cobalah online!

KrystosTheOverlord
sumber