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.
sumber
Jawaban:
PHP, periode 2.100.000.000
Siapa yang mengira ini mungkin di PHP ?! :-)
Ini sebenarnya quine pertama saya dan panjangnya 99 byte:
Meskipun PHP mendukung angka yang lebih besar daripada
2 * 10^8
dengan beralih dariinteger
kedouble
, 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):
Yah, setidaknya aku yang pertama menjawab.
sumber
Mathematica, periode
E8.5678 # 3E2.1923 # 4~ E6.2695 # 3 # 2Perhatikan bahwa skor dijelaskan dalam notasi Hyper-E . Iterasi menggantikan final
Nest[#!,9,9^9^99!]
dengan ekspansi desimal dariNest[#!,9,9^9^99!]
- 1,Nest[#!,9,9^9^99!]
- 2,Nest[#!,9,9^9^99!]
- 3, ..., 3, 2, 1, dan kembali keNest[#!,9,9^9^99!]
.sumber
ToString[#0, InputForm]
{"_~"}_~
, jadi saya kira itu harus valid ...R, periode acak dengan harapan 2 ^ 19936-0.5
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.
sumber
JavaScript, periode 9.007.199.254.700.000
Tidak akan menang, tapi menyenangkan bekerja dengan JavaScript untuk tantangan ini:
Mengikuti siklus berikut:
Catatan: Anda bisa membuatnya lebih pendek 18 byte, sementara hanya menghapus ~ 0,08% dari skor, seperti:
sumber
C, periode 2.100.000.000
Didasarkan pada jawaban PHP (jelas). Akan memperbarui dengan penjelasan ketika saya punya waktu.
sumber
C (gcc) , 66 byte, periode 2 ^ 64
Cobalah online!
2 ^ 64 angka tersedia dalam
unsigned long
bilangan bulat. Oleh karena itu, periode 2 ^ 64.sumber
Python 2
Cobalah online!
Dalam kode
b=0
perubahan untukb=1
saat itub=2
dan seterusnya sampai mencapaib=decimal expansion of the period
kemudian kembali keb=0
sumber
9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9
jauh lebih tinggi daripada9**9**99**99**99**99**99**99**99**99**99**99**99**99
. Yang mengatakan, Anda bisa melakukan sesuatu sepertieval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9)))
untuk nomor JAUH jauh lebih tinggi.Gol> <> , 70 byte, periode 325883196621297064957600206175719056476804879488288708188003274919860959534770101079512433396348062803055739640225395758790852315876868469390603793729639715908136196505908165227136154287969475839017544811926036808089596209081885772040898530121921794489026069641113281250
Bijaksana lain yang dikenal sebagai sangat besar (3.25E270)
Ini sebenarnya adalah versi jawaban yang saya ubah pada iterator 500 byte
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!
sumber