Model Markov sederhana akan digunakan dalam pertanyaan ini. Untuk informasi lebih lanjut tentang Rantai Markov, lihat http://setosa.io/ev/markov-chains/ .
Ambil string. Untuk contoh ini, kita akan menggunakan kata:
reader
Sekarang, untuk setiap karakter, ambil karakter yang muncul setelah setiap kemunculan karakter dalam string. ( `^`
mewakili awal dari string dan `$`
mewakili akhir)
`^` -> {'r'} # After the start of the string, there is an `r`.
'r' -> {'e', `$`} # After the first `r` (*r*eader), there is an `e`
# after the second (reade*r*), there is the end of the string.
'e' -> {'a', 'r'}
'a' -> {'d'}
'd' -> {'e'}
Sekarang, mulai dari awal string, pilih secara acak dari salah satu karakter di set berikutnya. Tambahkan karakter ini dan kemudian pilih dari karakter di set berikutnya, dan seterusnya sampai Anda mencapai akhir. Berikut adalah beberapa contoh kata:
r
rereader
rer
readereader
Jika suatu karakter muncul setelah karakter lain beberapa kali, itu lebih cenderung untuk dipilih. Misalnya, dalam cocoa can
, setelah a c
, ada dua pertiga peluang untuk mendapatkan o
dan satu pertiga peluang mendapatkan a
.
'c' -> {'o', 'o', 'a'}
Tantangan
Buat program yang tidak mengambil input dan menghasilkan string acak yang dihasilkan menggunakan Rantai Markov, seperti di atas, di mana input ke rantai adalah sumber program.
- Program harus memiliki setidaknya dua karakter, dua di antaranya harus sama (Untuk mencegah rantai "membosankan" yang hanya memiliki satu output)
- Anda dapat memodifikasi model untuk menggunakan byte alih-alih karakter jika Anda inginkan, tetapi ubah "karakter" menjadi "byte" pada aturan 1
- Program harus menghasilkan string secara acak dengan frekuensi yang diharapkan dalam teori
Ini kode-golf , jadi program tersingkat menang!
sumber
^
dan$
dalam tanda kutip? mungkin membuatnya lebih jelas untuk mengeluarkannya dari tanda kutip, atau menempatkannya dalam tanda kutip.Jawaban:
Pip , 64 byte
Ini sangat menyenangkan.
<tab>
mewakili karakter tab literal (0x09
). Cobalah online!Bagaimana?
TL; DR: escaped-string syntax, repr, dan eval.
Untuk string yang perlu mengandung
"
karakter literal , Pip telah lolos string , menggunakan\"
sebagai pembatas. Quine standar menggunakan string yang lolos akan terlihat seperti ini:Yaitu:
Y
ank (menyimpan sebagaiy
) string yang berisi"V Y".RPy
danV
sebagainya itu.RPy
mengambil repr dariy
, di mana kita menambahkan string literalV Y
. Akhirnya, hasilkan hasil evaluasi.Struktur quine Markov serupa, kecuali bahwa kita ingin menyimpan kode alih-alih mengeluarkannya dan kemudian melakukan beberapa hal dengannya.
t:V Y\"...\"
menugaskan hasil eval ket
. Di dalam kode eval'd, berikanm:"..."
string kodem
, yang akan kita evaluasi di akhirVm
.ST["t:V Y"RPy";Vm"C9]
membangun daftar yang berisidan mengubahnya menjadi string, yang secara default menggabungkan semua item. Bagian ini setara dengan
"V Y".RPy
dalam quine asli. Karena itu adalah ekspresi terakhir dalam string eval besar, nilainya adalah apa yangV
dikembalikan operator, dan dengan demikian apa yang ditugaskant
.Dengan demikian, setelah eval dan penugasan,
t
sama dengan kode lengkap, danm
berisiSekarang
Vm
mengevaluasi itu sebagai kode. Mari kita jabarkan apa yang terjadi.Sepasang catatan:
xxy
akan kembalixx
dan tidakxy
di pertandingan. Untungnya, bagaimanapun, tidak ada karakter ganda dalam kode ini, jadi tidak masalah.sumber
JavaScript,
217215 bytePerhatikan bahwa ini menggunakan
uneval
, yang hanya didukung oleh Firefox. Sampel berjalan:Seperti yang Anda lihat, ini sebagian besar omong kosong, tapi itu yang diharapkan;) OP telah menciptakan JSFiddle yang menunjukkan bahwa peluang output JS yang valid secara sintaksis sekitar 6,3%.
Jika fungsi membaca sendiri diizinkan, ini bisa 78 byte ES6:
Sangat, sangat jarang, ini menghasilkan JS yang valid secara sintaksis:
Favorit saya dari nama fungsi yang dibuatnya adalah
.splendom()
(split
+length
+random
)sumber
a.splerength.r()
, yang bisa berlaku;)Perl, 103 byte
Berdasarkan standar quine dan jawaban saya untuk pertanyaan ini :
Contoh Output
Mirip dengan pertanyaan lain, beberapa hasil menghasilkan Perl yang valid:
tetapi peluangnya sedikit lebih rendah, ~ 2%.
sumber
q{
merupakan awal dari string literal dan tidak ada}
untuk menutupnya. Perl sebenarnya cukup buruk dalam menjalankan urutan acak byte (dan ketika itu terjadi, biasanya karena string literal awal atau komentar).Kode mesin MS-DOS (file .COM), 63 byte - tidak bersaing
Non-bersaing karena quine tidak boleh mengakses kode sumbernya sendiri.
Varian 126 byte akan memenuhi persyaratan "tidak mengakses kode sumbernya sendiri"!
Varian 63 byte terlihat seperti ini:
Saya juga tidak yakin tentang distribusi probabilitas generator acak:
Program ini menggunakan fakta bahwa penghitung jam dan informasi lain yang dimodifikasi oleh interupsi disimpan di segmen 0 untuk menghasilkan angka acak.
Contoh untuk output yang dihasilkan adalah:
Dikonversi menjadi kode rakitan, programnya terlihat seperti ini:
sumber
C, 306
328585611615623673707byteKode sumber:
Dengan baris baru dan spasi putih ditambahkan untuk keterbacaan / penjelasan:
Penjelasan
Line 01
:p[][]
memegang hitungan satu karakter mengikuti yang lain.Line 02
:X
berisi sumber program, lolos dengan%c%s%c
.Line 03
:Y
akan berisi sumber literal program.c
,j
,*a
Adalah variabel penghitungan.Line 05
: SetelY
untuk berisi quine.Line 06
: Hitung kemunculan surat dip[][]
.Line 07
: Cetak status saat ini.Line 08
: Temukan karakter berikutnya secara acak, proporsional dengan jumlah padap[][]
.Output sampel:
p[++);p[99]=Y;putfor(aind(a++j,*a+j=j,c][c,*an(arile(pr*Y,Y[256]<<1);)][*Y,Y;)wha+++j=*aintfor*Y;prin(a+j]=j][256<1)pr(a;a;f(p[char(Y;for());};a;ma;ma=%s%chain(Y;ar(j][256<<<1)p[256<<raile(cha][9]<rin(j,34,34,Y[256]+j,Y,34,Y,c=Y,*a;*a;for(){0}
sumber
Ruby, 152 byte
Output sampel:
atau
Quines menggunakan pemformatan string melalui
"s%s"
, dan melakukan rantai Markov dengan mengambil semua irisan dua karakter, mengocoknya, dan mengubahnya menjadi kamus Hash, di mana untuk kunci duplikat, penampilan terakhir menentukan nilai. Untuk menghindari menambahkan logika tambahan untuk permulaan, saya melacak karakter keluaran yang paling baru digunakan$/
, yang secara otomatis diinisialisasi ke baris baru, dan memastikan bahwa baris baru selalu diikuti dalam kode dengan0
, karakter yang sama dengan kode dimulai. Untuk akhirnya, saya memanipulasi kode sumber sehingga hanya ada satu!
sehingga kami selalu berakhir setelah bang, gunakan<<33
untuk menambahkannya tanpa literal. Ini bisa di-golf lebih lanjut dengan menggunakan karakter satu digit yang tidak dapat dicetak dan bukannya ASCII 33, tetapi itu tampaknya terlalu menjengkelkan.sumber
p<<<<<33
Operator super super super super? ;-)Has(s).ears(2)
membuat saya tertawa!Rust, 564 byte (tidak kompetitif)
Karena saya sudah menulis quine Rust yang cukup rapi untuk pertanyaan lain, saya pikir saya akan menyesuaikannya untuk ini, karena tampaknya cukup sederhana. Meskipun aslinya kecil, untuk ini saya telah berusaha sangat kecil untuk meminimalkan ukuran. Berikut ini adalah versi yang diperluas untuk menjelaskan apa yang terjadi:
Output sampel 1:
Output sampel 2:
sumber
Python 2, 211 byte
Keluarkan hasilnya ke
stderr
.Cobalah online
Output sampel:
Penjelasan singkat:
s='s=%r;print s%%s';print s%s
format quine. Saya membuat strings
, yang akan berisi seluruh program.X
berisi prosedur untuk mengeksekusi secara rekursif.o
, yang akan dicetakstderr
setelah mencapai akhir rantai Markov.$$
, menggunakan dua karakter sehingga program akan bekerja untuk semua string. Saya bisa menggunakan karakter yang tidak ada dalam program sayachr(0)
, tapi saya pikir itu lebih lama.c
, yang (bersama dengano
) diinisialisasi ke karakter pertama dari program.c
dalam stringt
(variabel yang menahan quine dari kode sumber) adalahq
, yang akan dipilih dari untuk pemilihan berikutnyac
.sumber
PHP,
144135130120272220212 byteAtau, diformat untuk dibaca:
Output sampel:
dan:
dan:
dan:
Kecurangan PHP, 117
Bagi yang penasaran, jika kita menipu dengan membaca sumber kita sendiri, kita bisa melakukan 117:
sumber