Tulis sebuah program yang mampu menghasilkan sendiri secara acak.
Itu harus melakukan ini berdasarkan token yang digunakan dalam kode sumbernya. Jika kode sumber program Anda terdiri dari 50 token unik dan panjangnya 60 token, maka program harus menampilkan 60 token di mana setiap token dipilih secara acak dari salah satu dari 50 token unik.
Sebagai contoh, program ini akan memiliki kesempatan satu dalam 50 ^ 60 untuk mereproduksi dirinya sendiri.
Apa itu token? Itu tergantung pada bahasanya. Misalnya, pengidentifikasi ( foo_bar
), kata kunci ( while
), dan angka ( 42
) akan dihitung sebagai token dalam sebagian besar bahasa. Spasi tidak akan dihitung dalam sebagian besar bahasa.
Aturan tambahan:
- Output hanya dapat berisi token yang ditemukan dalam kode sumber program, dipisahkan oleh pembatas yang sesuai
- Output harus sama panjang dengan kode sumber program, dihitung dengan token
- Hanya satu bahasa pemrograman yang dapat digunakan
- Kode sumber harus memiliki setidaknya 3 token unik
- Kecualikan komentar dari kode sumber
- Program seharusnya hanya memiliki satu di U ^ L kesempatan untuk mereproduksi dirinya sendiri
Penilaian: Program yang memiliki peluang terbaik untuk mereproduksi dirinya sendiri, menang.
sumber
Jawaban:
Python 2, 3 ^ -3 = 0,037
exec
penyalahgunaan cukup berguna untuk mengurangi jumlah token. Sekarang diperbarui untuk tidak membaca file sumber!Ekstra
''
antaraexec
dan string tiga kutip raksasa hanya untuk menambah jumlah token ke minimum yang diperlukan 3. Ia digabungkan ke dalam string kedua karena konkatasi literal string implisit.Versi asli, membuka-sumber-file:
Sebenarnya, tata bahasa Python menempatkan token ENDMARKER di akhir file sumber, dan kami tidak dapat menghasilkan file sumber dengan ENDMARKER yang berserakan secara acak. Kami berpura-pura itu tidak ada.
sumber
".]';(?3 3 3){]`".;~({:,],{:,],6#{:)'';(?3 3 3){]`".;~({:,],{:,],6#{:)'''''''
.Javascript, 102 token, 33 unik, 7,73 × 10 -154
Catatan, ini adalah quine yang sebenarnya. Itu tidak membaca file atau menggunakan
eval
atauFunction.toString
sumber
Python: P (menghasilkan program dalam 1 percobaan) = 3.0317 * 10 ^ -123
34 token unik, 80 total token. Perhatikan bahwa ada spasi di akhir setiap baris.
Output sampel:
Berkat solusi Python lainnya oleh user2357112 untuk mengingatkan saya untuk membuang token terakhir dan menggunakan
__file__
yang sebelumnya saya tidak tahu.sumber
J - 1 dalam 11 17 = 1.978 x 10 -18
J memiliki banyak alat kecil yang berguna untuk menyelesaikan pekerjaan semacam ini.
Pertama-tama, setiap string angka yang dipisahkan spasi adalah satu token . Ini berarti array satu dimensi dari angka-angka itu. Inilah cara kerja lexer J. Omong-omong, itu tujuh belas
11
, jika ada yang penasaran.(,,,{:,{:)'QUINE'''
adalah trik quine umum dalam J, dibuat untuk menggunakan token sesedikit mungkin:{:
berarti Tail , sehingga menambahkan string ke dirinya sendiri, dan kemudian menambahkan dua salinan karakter terakhir ke akhir itu. Karena karakter terakhir adalah kutipan tunggal (J menggunakan string gaya Pascal), hasilnya adalahQUINE'QUINE'''
.;:
adalah tokenizer, dan memecah string input seolah-olah itu kode J, mengembalikan daftar kotak. Panjang hasil ini adalah 17.~.
mengambil semua elemen unik dari array ini. Panjang hasil ini adalah 11.?
disebut Roll . Untuk setiap bilangan bulat dalam argumennya, ia memilih angka positif acak lebih besar dari atau sama dengan nol, kurang dari angka itu. Jadi di sini J akan menghasilkan 17 angka dari 0 hingga 10 inklusif.{
menggunakan indeks acak untuk memilih item dari daftar token-in-box unik kami.;
buka semua kotak ini dan jalankan hasilnya bersamaan.Beberapa contoh mengikuti. Garis indentasi adalah prompt input, dan garis flush dengan sisi kiri adalah output interpreter.
sumber
Nota bene
Ini menyenangkan
Ada 17 token unik dan 54 token total untuk sekitar 1 dalam kesempatan 3.6e-67.
sumber
Spasi,
3 ^ -2053 ^ -1893 ^ -1813 ^ -132 ~ = 10 ^ -63Ini adalah program Whitespace yang, ketika diunggulkan dengan karakter acak, memiliki peluang 1 banding 3 ^ 132 untuk mereproduksi dirinya sendiri (3 token berbeda, diulang 132 kali). Itu harus diunggulkan dengan setidaknya 132 karakter acak saat dijalankan, (Whitespace tidak memiliki fungsi tanggal atau acak bawaan untuk di-seed dengan) mis
some_whitespace_interpreter my_quine.ws <some_random_source >quine_output.ws
. Skor akan ditingkatkan jika program bisa golf lagi, tapi ini adalah program Whitespace "nyata" pertama saya, jadi saya akan meninggalkannya dengan jumlah golf yang sedikit.Kode Ruang Kosong Biasa, atau lihat dijalankan : (untuk mencobanya, klik "edit", salin hal-hal di dalam tag <pre>; harus 132 karakter dengan EOL gaya Unix)
Kode dijelaskan dengan perintah apa adalah apa (tidak secara teknis quine, karena tidak akan mereproduksi komentar):
Jika seed kebetulan sama (karakter diambil mod 3 untuk dikonversi ke token) untuk ini, itu akan berhasil:
Ini adalah program yang sangat sederhana, kira-kira setara dengan program Ruby ini:
sumber
Perl, 27 token, P = 1,4779 x 10 -34
Edit terakhir: gunakan
@ARGV=$0
alih-alihopen*ARGV,$0
menyimpan token.=
,/
,@
,$
)W
)Jadi saya pikir itu membuat probabilitas (pow (2,2 * 4) * pow (4,4)) / pow (27,27), sekitar 1,48E-34.
Jika kode sumber dalam file bernama
ARGV
, maka Anda dapat menggunakan solusi token 26 ini dengan P = ~ 2.193 x 10 -31 :sumber
P = (4 * 2! + 4!) / 27!
yaitu sekitar 1,7632684538487448 x 10 ^ -26Perl 6 ,1 di 33 = 0,037037 ...
(Saya tahu ini bukan kode-golf, tapi ...)
Cobalah online!
Sama seperti jawaban Python, di mana token pertama adalah string literal yang dievaluasi. Tokennya adalah
Penjelasan:
sumber