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!
^
dan $
dalam tanda kutip? mungkin membuatnya lebih jelas untuk mengeluarkannya dari tanda kutip, atau menempatkannya dalam tanda kutip.