Seperti judulnya mungkin sarankan, masalah ini semi-terinspirasi oleh Bot Mabuk Dekat Penglihatan oleh @NP
Bot kami yang buruk ditempatkan pada kisi cartesian di tempat asalnya, dan setelah setiap menit, bot bergerak 1 unit di salah satu dari empat arah (Atas, Bawah, Kiri, Kanan).
Setelah n menit, semua ranjau laten di grid diaktifkan, menewaskan bot miskin yang mungkin menemukan diri mereka sendiri di atasnya. Tambang terletak di semua koordinat bilangan bulat yang memenuhi persamaan | y | = | x |.
Tantangan
Anda akan diberikan n , jumlah menit sebelum ledakan tambang, sebagai input, dan sebagai output, Anda harus menemukan probabilitas bahwa bot sudah mati .
Input : Angka alami yang mewakili n .
Output : Biarkan probabilitas bot mati menjadi p / q, di mana p dan q adalah bilangan bulat yang relatif prima (q tidak bisa 0, tetapi p bisa). Output h.
Aturan
- Algoritme Anda tidak boleh berjalan dalam waktu eksponensial atau lebih tinggi. Idealnya harus dijalankan dalam waktu polinomial atau kurang.
- Algoritme Anda harus dapat menangani input
n
<20 (dapat disesuaikan jika terlalu sulit) dalam waktu yang wajar. - Ini adalah tantangan kode-golf .
- Iterasi semua kemungkinan untuk suatu n dan pasti tidak akan diterima sebagai jawaban.
Uji Kasus
1
->0
2
->3
4
->39
6
->135
8
->7735
10
->28287
Contoh Perhitungan untuk n = 6
Kami memiliki 4 kemungkinan pergerakan: U, D, R, dan L. Jumlah total jalur yang dapat diambil adalah 4 ^ 6, atau 4096. Ada 4 kemungkinan kasus yang mendarat di sepanjang garis y = x: x, y = ± 1; x, y = ± 2; x, y = ± 3; atau x = y = 0. Kami akan menghitung jumlah cara untuk berakhir pada (1,1), (2,2), dan (3,3), kalikan dengan 4 untuk memperhitungkan kuadran lain, dan tambahkan ini ke sejumlah cara untuk berakhir pada (0,0).
Kasus 1: Bot berakhir pada (3, 3). Agar bot berakhir di sini, ia harus memiliki 3 gerakan yang benar, dan 3 gerakan ke atas. Dengan kata lain, jumlah total cara untuk sampai ke sini adalah cara untuk mengatur ulang huruf dalam urutan RRRUUU, yaitu 6 pilih 3 = 20.
Kasus 2: Bot berakhir pada (2,2). Agar bot berakhir di sini, bisa saja ada 2 gerakan ke atas, 3 gerakan ke kanan, dan 1 gerakan ke kiri; atau 2 gerakan kanan, 3 gerakan ke atas, dan 1 gerakan ke bawah. Dengan demikian, jumlah total cara untuk sampai ke sini adalah jumlah cara untuk mengatur ulang huruf dalam urutan RRRLUU dan UUUDRR, yang keduanya (6 pilih 1) * (5 pilih 2) = 60, dengan total 120 kemungkinan .
Kasus 3: Bot berakhir pada (1,1). Agar bot berakhir di sini, bot bisa memiliki: 1 gerakan kanan, 3 gerakan ke atas, dan 2 gerakan ke bawah. Dalam hal ini, jumlah cara untuk mengatur ulang huruf dalam urutan RUUUDD adalah (6 pilih 1) * (5 pilih 2) = 60.
1 gerakan ke atas, 3 gerakan ke kanan, dan 2 gerakan ke kiri. Dalam hal ini, jumlah cara untuk mengatur ulang huruf-huruf dalam urutan URRRLL adalah (6 pilih 1) * (5 pilih 2) = 60.
2 gerakan kanan, 1 gerakan kiri, 2 gerakan ke atas, dan 1 gerakan ke bawah. Dalam hal ini, jumlah cara untuk mengatur ulang huruf dalam urutan UUDRRL adalah (6 pilih 1) * (5 pilih 1) * (4 pilih 2) = 180.
Dengan demikian, jumlah total cara untuk berakhir pada (1,1) adalah 300.
Kasus 4: Bot berakhir pada (0,0). Agar bot berakhir di sini, bot bisa memiliki:
3 gerakan kanan dan 3 gerakan kiri. Dalam hal ini, jumlah cara untuk mengatur ulang huruf dalam urutan RRRLLL adalah (6 pilih 3) = 20.
3 gerakan ke atas dan 3 gerakan ke bawah. Dalam hal ini, jumlah cara untuk mengatur ulang huruf-huruf dalam urutan UUUDDD adalah (6 pilih 3) = 20.
1 gerakan kanan, 1 gerakan kiri, 2 gerakan ke atas, dan 2 gerakan ke bawah. Dalam hal ini, jumlah cara untuk mengatur ulang huruf dalam urutan RLUUDD adalah (6 pilih 1) * (5 pilih 1) * (4 pilih 2) = 180.
1 gerakan naik, 1 gerakan turun, 2 gerakan kanan, dan 2 gerakan kiri. Dalam hal ini, jumlah cara untuk mengatur ulang huruf dalam urutan RRLLUD adalah (6 pilih 1) * (5 pilih 1) * (4 pilih 2) = 180.
Dengan demikian, jumlah total cara untuk berakhir pada (0,0) adalah 400.
Menambahkan kasus-kasus ini bersama-sama, kita mendapatkan jumlah total cara untuk berakhir di | y | = | x | adalah 4 (20 + 120 + 300) + 400 = 2160. Dengan demikian, probabilitas kami adalah 2160/4096. Ketika fraksi ini berkurang sepenuhnya, itu 135/256, jadi jawaban kami adalah 135 .
sumber
Jawaban:
Python 2 , 65 byte
Cobalah online!
Probabilitas bot sudah mati dapat dinyatakan sebagai:
dan binomial dipahami sama dengan ketika tidak utuh.0 n/2
Kita bisa bernalar seperti ini. Berapa probabilitas bot mendarat di garis ? Ini terjadi jika jumlah total gerakan ke atas dan kiri sama dengan jumlah total gerakan ke bawah dan ke kanan. Ini adalah probabilitas yang sama bahwa, katakanlah, Anda melempar koin kali dan mendapatkan ekor sebanyak kepala. Anda harus memilih membalik untuk menjadi kepala dari membalik, yang dapat dilakukan dalam cara, dari sekuens yang mungkin secara keseluruhan, memberikan probabilitasy=x n n/2 n (nn/2) 2n
Probabilitas pendaratan garis juga . Jadi, probabilitas pendaratan di kedua baris adalah jumlah dari ini atau , kecuali kita menghitung dua kali kemungkinan pendaratan di kedua baris, dan harus mengurangi itu untuk mengkompensasi.y=−x s 2s x=y=0
Ternyata probabilitas pendaratan di hanya , produk dari probabilitas pendaratan di setiap baris. Kita dapat berargumen bahwa peristiwa itu independen sebagai berikut: jika kita memilih urutan acak dengan jumlah yang sama "Atas atau Kiri" dan "Bawah atau Kanan" untuk mendarat di dan juga dengan "Atas atau Kanan" dan "Bawah atau Kiri" "untuk , kita dapat menggabungkan mereka secara unik ke dalam urutan Atas, Bawah, Kiri, Kanan dengan mengambil persimpangan pasangan arah pada setiap posisi.x=y=0 s2 x=y x=−y
Jadi, probabilitas mendarat di atau adalah .x=y x=−y 2s−s2
Kode menghitung binomial menggunakan ekspresi ini sebagai basis . Untuk mengekstrak pembilang dari fraksi probabilitas, kami mencatat bahwa penyebutnya adalah kekuatan 2, jadi kami menggunakan ekspresi untuk membagi kekuatan maksimal 2 , yang dinyatakan sebagai trik bit klasik .(nn/2)
(b+1)**n/b**(n/2)%b
b=2**n
r/(r&-r)
r
r&-r
Solusinya adalah golf dengan menuliskan sebagai sehingga hanya dirujuk satu kali, dan bekerja tanpa fraksi untuk tetap berada dalam bilangan bulat. Perhitungannya adalah polinomial-waktu dalam bahkan dengan cara komputasi binomial yang funky.2s−s2 1−(1−s)2 s 1/2n n
Setelah menulis bukti probabilitas bot mati, saya menemukan cara yang lebih bersih untuk membuktikannya dan menyajikannya.
Mari kita melacak nilai-nilai dan setelah setiap gerakan bot. Masing-masing dari empat arah naik, turun, kiri, dan kanan baik kenaikan atau penurunan masing-masing dan , dengan empat arah sesuai dengan empat kombinasi.a=x+y b=x−y a b
Jadi, perpindahan acak sama dengan menambahkan secara acak ke dan secara independen ke . Ini sama dengan melakukan jalan acak terpisah pada dan .±1 a ±1 b a b
Sekarang, robot berakhir pada garis atau tepat ketika atau . Jadi, probabilitas berakhir dengan adalah dan juga untuk . Karena jalan-jalannya independen, probabilitas dan adalah , jadi probabilitas bahwa setidaknya satu adalah nol adalah komplemen .x=y x=−y a=0 b=0 a=0 s=12n(nn/2) b=0 a≠0 b≠0 (1−s)2 1−(1−s)2
sumber