Latar Belakang
Salah satu sumber ennui dalam permainan peran-bermain di atas meja adalah berurusan dengan gulungan yang melibatkan banyak dadu. Menggunakan mantra Disintegrasi mungkin instan, tetapi menggulung dan menambahkan 40 dadu tentu saja tidak!
Sejumlah saran untuk penanganan ini dibahas di rpg.stackexchange.com . Namun beberapa dari mereka, seperti menggunakan program roller atau dadu rata-rata, menghilangkan kesenangan dan rasa kontrol dari para pemain. Lainnya, seperti menggulirkan 4 dadu dan mengalikan totalnya dengan 10, membuat hasilnya jauh lebih berayun (sementara rata-rata dadu bertingkah berlawanan arah).
Pertanyaan ini menyangkut metode pengurangan jumlah dadu gulungan tanpa mengubah baik hasil rata-rata (rata-rata) atau swinginess (varians).
Notasi dan matematika
Dalam pertanyaan ini, kami akan menggunakan notasi berikut untuk mewakili gulungan dadu:
- n d k (misalnya 40d6) mengacu pada jumlah n gulungan mati k-sided.
- n d k * c (mis. 4d6 * 10) menjelaskan mengalikan hasil dengan konstanta c.
- Kita juga dapat menambahkan gulungan (mis. 4d6 * 10 + 40d6) dan konstanta (mis. 4d6 + 10).
Untuk satu die roll, kami dapat menunjukkan bahwa:
- Mean : E [1d k ] = (k + 1) / 2
- Varians : Var (1d k ) = (k-1) (k + 1) / 12
Dengan menggunakan properti dasar mean dan varians, kita dapat lebih jauh menyimpulkan bahwa:
- Berarti : E [ m d k * a + n d l * b + c ] = saya .e [1d k ] + bn [1d. L ] + c
- Variance : Var ( m d k * a + n d l * b + c ] = a . ² m .Var (1d k ) + b ². N .Var (1d l )
Tugas
Mengingat tiga bilangan bulat n , k dan r , program anda harus output cara mendekati n d k di paling r gulungan, dengan kendala berikut:
- Solusinya harus memiliki mean yang sama dan varians sebagai n d k .
- Solusinya harus mengandung jumlah gulungan yang kemungkinan terbesar kurang dari atau sama dengan r , karena lebih banyak gulungan menghasilkan distribusi yang lebih halus.
- Anda harus membatasi solusi Anda hanya dengan menggunakan dadu sisi- k , kecuali jika Anda membidik Bonus (lihat di bawah).
- Jika tidak ada solusi (karena r terlalu kecil), program harus menampilkan string "AKU SEXY SHOELESS GOD OF WAR!".
- Parameter dilewatkan sebagai string yang dipisahkan oleh spasi.
- Anda dapat berasumsi bahwa 1 ≤ n ≤ 100, 1 ≤ r ≤ n dan k adalah salah satu dari 4, 6, 8, 10, 12 dan 20 (dadu standar yang digunakan di permukaan meja).
- Outputnya harus dalam format yang dijelaskan dalam Notasi (misalnya 4d6 * 10 + 5), dengan spasi opsional di sekitar + s tetapi tidak di tempat lain. Pengganda satuan juga opsional: 4d6 * 1 dan 4d6 keduanya valid.
Anda dapat menulis program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi. Hasil harus dicetak ke STDOUT (atau alternatif terdekat) atau dikembalikan sebagai string.
Contohnya
>> "10 6 10"
10d6
>> "10 6 4"
2d6*2+2d6+14
>> "10 6 3"
1d6*3+1d6+21
>> "10 6 2"
1d6*3+1d6+21
>> "10 6 1"
I AM A SEXY SHOELESS GOD OF WAR!
Mencetak gol
Kode terpendek menang. Aturan standar berlaku.
Bonus
-33% (dibulatkan sebelum pengurangan) jika program Anda juga mengembalikan solusi yang menyertakan dadu yang valid selain k (di mana nilai yang valid, seperti disebutkan di atas, adalah 4, 6, 8, 10, 12 dan 20). Jika Anda memilih untuk melakukannya, maka Anda harus selalu mengembalikan solusi seperti itu jika perlu, dan menangani solusi yang menggunakan banyak jenis cetakan. Contoh:
>> "7 4 3"
3d6+7
sumber
Jawaban:
GolfScript (
163 143133 byte)Demo online
Ketika tidak mencampur jenis dadu, masalah berkurang menjadi mengekspresikan
n
sebagai jumlah tidak lebih darir
kotak, dank
tidak relevan kecuali untuk perhitungan konstanta di akhir. Sebagian besar jawaban ini adalah pembukuan diperlukan untuk mengekspresikan hasil dalam format yang diinginkan: perhitungan yang sebenarnya adalah^\?,{^base}%{0\{.*+}/^=},
untuk menemukan faktor-faktor perkaliana
,b
, dll .; dan^@{-}/@)*.2/
untuk menghitung konstanta.Pembedahan
sumber
Python,
487461452 - 33% = 303 byteKarena tidak ada orang lain yang melakukannya, berikut adalah solusi yang menangani berbagai jenis dadu. Seperti solusi lain, ia menghasilkan serangkaian solusi yang mungkin dan menyaringnya. Ia menggunakan fakta bahwa (k + 1) (k-1) = k ^ 2-1 dan dua celah semi dalam spec (oops!): Kurangnya larangan untuk mencetak bentuk berlebihan 0d k * a (yang menyimpan semua 5 byte!), dan kurangnya menjalankan pembatasan waktu (itu menjadi lambat cukup cepat, meskipun menjalankan semua contoh yang diberikan).
Untuk hasil yang lebih cantik, tambahkan
if x[0]
setelah"%sd%s*%s"%x for x in s
:sumber