Latar Belakang
Saya memiliki koleksi "kaus kaki hari kerja", yang merupakan tujuh pasang kaus kaki yang dilabeli oleh hari-hari dalam seminggu. Ketika saya mencuci kaus kaki saya, mereka berakhir di tumpukan, dan saya harus mengaturnya menjadi pasangan yang benar sebelum memasukkannya ke dalam lemari. Strategi saya adalah menarik satu kaus kaki acak dari tumpukan sekaligus dan meletakkannya di laci. Setiap kali ada sepasang kaus kaki yang serasi di laci, aku mengikatnya dan meletakkannya di lemari. Tugas Anda adalah untuk mensimulasikan proses acak ini dan mengembalikan jumlah undian yang diperlukan untuk menemukan pasangan yang cocok pertama.
Memasukkan
Input Anda adalah bilangan bulat N ≥ 1 . Ini mewakili "jumlah hari dalam seminggu": ada N pasang kaus kaki di tumpukan, dan masing-masing pasangan memiliki label yang berbeda. Jika perlu, Anda juga dapat mengambil seed PRNG sebagai input.
Keluaran
Output Anda adalah jumlah kaus kaki yang harus saya gambar sebelum pasangan yang cocok pertama kali ditemukan. Misalnya, jika dua kaus kaki pertama sudah membentuk pasangan yang cocok, hasilnya adalah 2
.
Tentu saja, hasilnya acak, dan tergantung pada urutan gambar. Kami berasumsi bahwa semua pesanan penarikan memiliki kemungkinan yang sama , sehingga setiap kali kaus kaki ditarik, pilihannya seragam dan independen dari semua pilihan lainnya.
Contoh
Misalkan N = 3 , sehingga kita memiliki total 6 kaus kaki, berlabel AABBCC . Salah satu kemungkinan menjalankan "protokol sock-drawing" adalah sebagai berikut:
| Pile | Drawer | Pairs
Begin | AABBCC | - | -
Draw B | AABCC | B | -
Draw C | AABC | BC | -
Draw B | AAC | C | BB
Draw A | AC | AC | BB
Draw A | C | C | AA BB
Draw C | - | - | AA BB CC
Pasangan yang cocok pertama ditemukan setelah menggambar B kedua , yang merupakan kaus kaki ketiga yang harus ditarik, sehingga output yang benar adalah 3
.
Aturan dan penilaian
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan. Input dan output dapat dalam format yang masuk akal, termasuk unary (string 1
s).
Anda dapat berasumsi bahwa RNG bawaan bahasa Anda sempurna. Anda tidak harus benar-benar mensimulasikan protokol sock-drawing, selama output Anda memiliki distribusi probabilitas yang benar.
"Uji kasus"
Berikut adalah perkiraan probabilitas semua keluaran untuk input N = 7 :
Output 2 3 4 5 6 7 8
Probability 0.077 0.154 0.210 0.224 0.186 0.112 0.037
Untuk menguji solusi Anda, Anda dapat menjalankannya untuk, katakanlah, 40.000 kali dan lihat apakah distribusi output cukup dekat dengan ini.
Draw all socks. End up with an odd number.
Jawaban:
Jelly , 8 byte
Cobalah online! atau verifikasi distribusi untuk N = 7 .
Latar Belakang
Biarkan n menjadi jumlah pasangan; ada 2n kaus kaki individu.
Untuk undian pertama, ada 2n kaus kaki dan 0 dari mereka akan menghasilkan pasangan yang cocok. Oleh karena itu, probabilitas keberhasilan adalah 0 / 2n = 0 .
Karena undian pertama tidak berhasil, ada 2n - 1 kaus kaki di tumpukan dan 1 dari mereka akan menghasilkan pasangan yang cocok. Oleh karena itu, probabilitas keberhasilan adalah 1 / (2n - 1) .
Jika undian kedua tidak berhasil, ada 2n - 2 kaus kaki di tumpukan dan 2 dari mereka akan menghasilkan pasangan yang cocok. Oleh karena itu, probabilitas keberhasilan adalah 2 / (2n - 2) .
Secara umum, jika penarikan pertama k tidak berhasil, ada 2n - k kaus kaki pada tumpukan dan 2 dari mereka akan menghasilkan pasangan yang cocok. Oleh karena itu, probabilitas keberhasilan adalah k / (2n - k) .
Akhirnya, jika tidak ada yang pertama n menarik berhasil, ada 2n - k kaus kaki di tumpukan dan mereka semua akan menghasilkan pasangan yang cocok. Oleh karena itu, probabilitas keberhasilan adalah n / (2n - n) = 1 .
Bagaimana itu bekerja
sumber
Jelly, 8 byte
Cobalah online!
Untuk memverifikasi, berikut adalah versi yang menampilkan keluaran yang diinginkan dan hasil dari operasi "daftar acak" (untuk melihat urutan kaus kaki yang digunakan).
sumber
Python, 66 byte
Dennis memikirkan cara cerdas untuk mengatur ulang berbagai hal, menghemat 5 byte.
sumber
MATL ,
1615 byteCobalah online! Atau amati distribusi empiris untuk 1000 sampel dalam kasus N = 7 (butuh beberapa saat).
Ini secara langsung menghasilkan variabel acak yang mewakili hasil, berdasarkan distribusi probabilitasnya. Misalkan N adalah jumlah pasangan kaus kaki, dan misalkan p ( k ) menunjukkan probabilitas bahwa undian k -th berhasil, dikondisikan pada fakta bahwa undian k -1-th tidak berhasil. Kemudian (lihat juga di sini ):
Jadi, kode ini berulang untuk maksimum penarikan N +1. Pada undian k -th, dihasilkan suatu variabel acak yang sama dengan 1 dengan probabilitas ( k -1) / (2 * N - k ), atau 0 sebaliknya. Setiap kali variabel acak sama dengan 1 (undian telah berhasil) proses berhenti dan k saat ini adalah output.
sumber
MATL ,
1413 byteCobalah online! Atau amati distribusi empiris untuk 4000 sampel dalam kasus N = 7 (butuh beberapa saat).
sumber
JavaScript,
7773 bytePenjelasan
sumber
f=(n)=>
dengann=>
(atau dua, jika Anda ingin mempertahankan tugas, beberapa menyimpannya , beberapa menghapusnya ).CJam, 17 byte
Uji di sini.
sumber
Python 3,
142105104 byteBerkat Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ karena telah menghemat satu byte!
Jawaban pertama saya:
Jawaban baru saya:
Keduanya keluar dengan
NameError
ons
.sumber
R, 49
Saya yakin pasti ada cara yang lebih baik untuk melakukan ini di R! Saya mencoba melakukan sesuatu yang lebih pintar tetapi tidak berhasil.
Sunting: Ditingkatkan oleh @bouncyball karena tidak harus menjadi fungsi.
sumber
function(N)
? menggunakanN=scan();
akan menghemat 2 bytePython 2, 101 byte
sumber
VBA, 61 byte
- memodelkan probabilitas pergeseran pertandingan kaus kaki karena kegagalan sebelumnya untuk mencocokkan. Pada titik evaluasi, K adalah "kaus kaki di tangan", jadi nomor undian adalah satu lagi.
sumber
Pyth, 14 byte
Penjelasan:
sumber