Tantangan
Tujuan Anda adalah menulis program yang mencetak program lain. Program yang dicetak harus mencetak program lain, dan program yang baru harus mencetak program lain, sampai akhir.
Aturan
- Setiap program harus kurang dari 256 byte. (Jika ini perlu diubah, tinggalkan komentar)
- Program terakhir harus berupa program kosong.
- Harus ada sejumlah program yang terbatas, sehingga program tersebut tidak dapat berupa quine.
- Semua program harus dijalankan dalam bahasa yang sama.
- Tidak ada input yang diizinkan.
- Program yang menang adalah program yang mencetak sebanyak mungkin program, menghitung sendiri.
Semoga berhasil!
code-challenge
code-generation
Kura-kura
sumber
sumber
2^2048
, atau3.2317e616
.a*10^b
mana1<=a<10
danb
merupakan bilangan alami.1.2673e614
.Jawaban:
CJam, 4,56 × 10 526 program
Skor pasti: 254 219 + 254 192 + 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 3
Semua program harus disimpan menggunakan pengkodean ISO-8859-1 untuk memenuhi batas ukuran file.
Terima kasih kepada @ChrisDrost yang menunjukkan bug dan menyarankan pendekatan bersarang.
Cobalah online di penerjemah CJam .
254 219 + 2 ≈ 4,56 × 10 526 program
Pembagian garis skor dapat dicapai dengan program berikut yang jauh lebih sederhana 1 .
Menjalankan program ini menghasilkan program
dan setelah 254 219 - 1 iterasi lagi, program
Program non-kosong terakhir ini keluar dengan kesalahan 2 dan tidak mencetak apa pun (program kosong).
Bagaimana itu bekerja
Asumsikan string sudah ada di tumpukan.
254 192 ≈ 5,35 × 10 461 lebih banyak program
Di sinilah segalanya menjadi sedikit gila.
Program pertama sangat kompresif. Dengan menulis program serupa yang, alih-alih program kosong, akhirnya menghasilkan program pertama dari bagian di atas, kita dapat meningkatkan skor dengan 254 192 program 3 .
Program
mirip dengan program pertama dari bagian sebelumnya, dan menjalankan yang pertama dan hasilnya untuk 254 192 iterasi menghasilkan yang terakhir.
Asumsikan string sudah ada di tumpukan:
Program Moar
Program pertama dari bagian sebelumnya masih sangat dapat dikompres, sehingga kita dapat menerapkan metode yang sama dan menulis sebuah program yang, setelah 254 166 iterasi, menghasilkan program yang disebutkan di atas.
Mengulangi teknik ini berulang-ulang sampai kita mencapai batas 255 byte, kita dapat menambahkan total 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 1 ≈ 1,59 × 10 399 program ke orang-orang dari bagian sebelumnya.
1 Newline ditambahkan untuk kejelasan.
2 Per konsensus di Meta , ini diizinkan secara default.
3 atau 0,00000000000000000000000000000000000000000000000000000000000000000012%
sumber
JavaScript, 1000 program
Apakah ini valid tergantung pada bagaimana tepatnya memahami aturan ketiga.
sumber
Ruby, 1,628 × 10 ^ 237 program
Pendekatan yang sama dengan jawaban Perl saya, tetapi karena Ruby sudah menangani int besar, lebih mudah untuk menyimpan sebagai hex.
Ruby, 9,277 × 10 ^ 90 program
Jadi upaya ini adalah variasi yang sedikit berbeda pada quine-like sebelumnya, tetapi karena semua fungsi tambahan, saya tidak mendapatkan jumlah yang mendekati setinggi yang lainnya ... Menarik untuk mencoba pendekatan lain!
sumber
Python 2, 9,7 * 10 ^ 229 program
sumber
C, 2,2 * 10 ^ 177 program
Itu tidak sempurna, tapi cukup bagus. Maksud saya persis
255
panjangnya byte dan menghasilkan program dengan panjang yang sama. Anda mungkin bisa bermain-main lagi untuk mendapatkan beberapa program lagi, tetapi saya akan membiarkannya seperti sekarang.Program ini didasarkan pada quine C sederhana. Selain itu ada algoritma penghitungan yang cukup sederhana yang menghitung melalui semua nilai yang mungkin dari array char
n
. Kami memiliki program sebanyak permutasi stringn
.Rentang karakter dibatasi hingga rentang dari
#
(= 35) hingga[
= (91). Itu karena saya tidak mau"
atau\
dalam string, karena mereka perlu melarikan diri.Pembuatan program berakhir ketika semua nilai dalam array char
n
adalah[
. Kemudian ia mengeluarkan program boneka sederhanamain(){}
, yang dengan sendirinya tidak menghasilkan apa-apa.Sebagai demonstrasi yang seharusnya berhasil, saya baru saja mengubah batas, jadi hanya karakter antara ASCII-Code
35
dan36
digunakan dan hanya 4 elemen array.Program yang dihasilkan adalah
Ini output
2^4 + 1 = 17
program yang berbeda.Jadi program di atas menghasilkan
((91-35)+1)^101 + 1 = 57^101 + 1 ~= 2.2 * 10^177
program yang berbeda. Saya tidak yakin apakah ini penting, atau apakah perhitungan saya benarsumber
2.2 * 10^177
(untuk mereka yang ingin membandingkan)?Perl, 1 × 10 ^ 163
Kalau tidak, ini adalah quine yang cukup mendasar, menyusut ke karakter sesedikit mungkin, yang hanya berjalan sementara counter tidak
0
.sumber
Common Lisp, 10 113 -1
Jumlah sembilan dibatasi oleh ukuran maksimum kode, 256, dengan mempertimbangkan ruang yang diperkenalkan oleh printer.
sumber
Perl, 1.4 * 10 ^ 225
Pendekatan serupa dengan python; hasil yang sama!
sumber
> <> , 65534 (?) Program
Saya telah menambahkan tanda tanya di sebelah 65.533 karena saya belum memverifikasi bahwa ia dapat mencetak 65.533 (walaupun saya punya alasan untuk percaya seharusnya). Setelah saya punya sedikit waktu lagi, saya akan mencari cara untuk mengujinya.
Anda dapat mencobanya online di sini .
Inti dari program ini adalah bahwa ia mengubah output karakter di akhir dan kemudian mengurangi nilai numeriknya sebelum dicetak. Saya mendapat 65534 program karena nilai karakter ascii pada akhir kode adalah 65533, jadi menghitung program pertama kita memiliki 65534 (jika Anda menghitung program kosong 65535, saya kira). Program terakhir "kembali" bukanlah apa-apa; itu hanya berakhir ketika nilai karakter adalah 0.
Saya cukup yakin ini akan dapat mencetak karakter untuk semua iterasi: Saya tidak dapat menemukan sumber pasti untuk berapa banyak karakter> <> dapat dicetak, tetapi ada karakter langsung di bawah 65533, secara numerik.
Beri tahu saya jika ada masalah dengan implementasi ini; Saya sedikit tidak yakin tentang validitas entri saya.
Penjelasan
Saya tanpa malu-malu mencuri ide menggunakan tanda kutip tunggal untuk membuat pseudo-quine dari wiki> <> dan komentar yang pernah saya lihat di sini.
Apa yang dilakukannya adalah mem-parsing semua setelah tanda kutip sebagai karakter, lalu kurangi yang terakhir. Dari sana hanya membalik tumpukan (sehingga untuk mencetak dalam urutan yang benar), mendorong tanda kutip ke tumpukan, dan kemudian mencetak hingga tumpukan kosong.
sumber
Python, 1 × 10 ^ 194 program
Ini harus dijalankan dari file, bukan repl interaktif. Itu bukan quine.
Terima kasih kepada @The Turtle untuk membantu saya menghemat 3 byte, yang mana lebih banyak ruang untuk sembilan!
Terima kasih kepada @poke karena membantu saya menghemat 2 byte, yang mana lebih banyak ruang untuk sembilan!
sumber
if n!=0
itu mubazir. Anda bisa menulisif n
.if n:
dan di antarareplace
argumen.Bash, 52 program
Benar-benar tidak terinspirasi, dan (mudah-mudahan) solid di tempat terakhir.
sumber