Contoh klasik untuk memperkenalkan orang kepada konsep distribusi probabilitas diskrit adalah mesin kacang . Mesin ini memiliki sejumlah besar kelereng jatuh dari lorong sempit di atas, setelah itu mereka menabrak deretan pin interlaced, di mana pada setiap pin yang terkena marmer mungkin jatuh ke kiri atau kanan pin. Akhirnya, pin dikumpulkan dalam tempat sampah vertikal di bagian bawah mesin. Diagram sederhana dari mesin ini terlihat seperti ini:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|
Dalam diagram ini, O
menandakan lokasi dari mana kelereng jatuh. Masing ^
- masing adalah pin di mana marmer memiliki peluang 50% untuk bergerak ke alun-alun baik ke kiri atau ke kanan pin. Kelereng kemudian berkumpul di tempat sampah di bagian bawah perangkat, dan untuk jumlah kelereng yang cukup besar, ketinggian tumpukan marmer di tempat sampah akan menyerupai distribusi binomial diskrit.
Tantangan
Untuk tantangan ini, Anda akan menghitung distribusi probabilitas yang dihasilkan dari mesin kacang berdasarkan diagram seperti di atas. Diagram ditafsirkan sebagai 'program' dua dimensi yang dilewati kelereng, baik terhadap bidang di samping atau bidang di bawah bidang saat ini. Ketika kelereng mencapai bagian bawah mesin, mereka dihitung untuk distribusi probabilitas. Agar tetap menarik, diagram ini akan berisi beberapa bidang lebih dari sekadar sumber dan pin sederhana. Diagram contoh adalah:
| O |
| ^ |
| ^ / |
| ^ | ^ |
| <^- = v |
| ^ ^ ^ ^ ^ |
Selanjutnya, kelereng sekarang masing-masing memiliki arah putaran. Arah ini diatur oleh beberapa bidang dan menentukan bidang mana selanjutnya yang bergerak marmer di beberapa bidang lainnya.
Bidang-bidang berikut didefinisikan:
O
: Sumber. Menumbuhkan kelereng langsung di bawahnya. Arah kelereng ini adalah 50% kiri, 50% kanan. Setiap sumber menghasilkan jumlah kelereng yang sama.U
: Tenggelam. Setiap kelereng yang memasuki bidang ini dihapus dari mesin kacang.: Ruang kosong. Jika sebuah marmer tiba di bidang ini, ia akan pindah ke bidang di bawah ini.
-
: Lantai. Jika sebuah marmer tiba di bidang ini, ia akan bergerak ke bidang ke kiri atau bidang di sebelah kanan, tergantung pada arahnya saat ini.^
: Splitter. Jika sebuah marmer tiba di bidang ini, ia memiliki 50% bergerak ke bidang di sebelah kanan atau bidang di sebelah kiri pembagi. Ini juga menentukan arah marmer.v
: Bergabunglah. Jika sebuah marmer tiba di bidang ini, ia akan pindah ke bidang di bawah ini./
: Bantalan miring. Jika sebuah marmer tiba di bidang ini, ia akan bergerak ke bidang di sebelah kiri pad, mengatur arah marmer.\
: Sama seperti sebelumnya, tetapi ke kanan.|
: Reflektor. Jika sebuah marmer tiba di bidang ini, itu akan membalikkan arah marmer, dan memindahkan marmer ke lapangan ke kanan atau ke kiri, berdasarkan pada arah terbalik ini.=
: Meriam. Jika kelereng tiba di bidang ini, ia akan bergerak ke kanan atau kiri di arah arus, sampai marmer bertemu bidang yang tidak,
-
atauO
.<
: Sama seperti sebelumnya, tetapi akan selalu mengatur arah dan bergerak ke kiri.>
: Sama seperti sebelumnya, tetapi ke kanan.
Jaminan berikut diberikan sehubungan dengan diagram.
- Setiap baris input akan memiliki panjang yang sama persis di bidang.
- Bidang paling kiri dan paling kanan dari setiap baris akan selalu a
|
. - Diagram tidak akan berisi jalur yang memungkinkan kelereng dapat tersangkut di mesin untuk jumlah iterasi yang tidak pasti, seperti
\/
atau^^
. - Diagram hanya akan berisi bidang yang disebutkan di atas.
- Ada satu atau lebih sumber
Hasil
Tugas Anda adalah membuat grafik bar ASCII 16-line tinggi dari distribusi probabilitas di mana kelereng keluar dari sisi bawah grafik, diskalakan sehingga probabilitas terbesar mencakup semua 16 karakter. Jadi untuk masalah berikut:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
Program Anda harus menghasilkan solusi berikut (perhatikan bahwa ia harus memiliki lebar yang sama dengan program input, termasuk pipa ke samping:
# #
# #
# #
# #
# #
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # # #
# # # # # #
Contohnya
Berikut ini adalah contoh yang harus menguji fungsionalitas semua jenis bidang yang berbeda:
| O O |
| O ^ / <^\\\ |
| ^ > ^ |
| ^ ^ ^ =|
| ^ ^ | ^ <^ O |
| ^ > ^ | ^ O ^> v |
|| ^U ^ | = ^\ |
| ^ ^ ^ ^U ^\ ---^ |
| = ^ ^ = v |
Itu harus menghasilkan output berikut:
#
#
#
#
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
## # # #
## # # # #
# ### # # # #
# # ### # # # #
# # ### # # # #
Aturan
Baik fungsi dan program lengkap merupakan jawaban yang valid untuk tantangan ini. Anda akan menerima diagram sebagai string yang dipisahkan baris baru, dan Anda harus mengembalikan grafik output dalam format yang diberikan. Aturan input / output default berlaku. Sementara mengikuti dan memimpin baris baru diizinkan dalam output, setiap baris harus memiliki lebar yang sama persis dengan input.
Untuk memungkinkan lebih banyak solusi kreatif, program Anda hanya perlu menampilkan hasil yang benar lebih dari 90% dari waktu untuk diagram yang sama. Bagaimanapun, ini adalah simulasi probabilitas.
Mencetak gol
Ini adalah kode-golf , sehingga skor terendah dalam byte menang.
v
= [space]
?
v
dan [space]
berbeda dalam bagaimana meriam berinteraksi di sekitar mereka.