Tindak lanjut dari tantangan ini
Diberikan satu set dadu campuran, output distribusi frekuensi bergulir mereka semua dan menjumlahkan angka-angka digulung pada setiap dadu.
Sebagai contoh, pertimbangkan 1d12 + 1d8
(menggulung 1 dadu 12 sisi dan 1 dadu sisi 8). Gulungan maksimum dan minimum adalah 20
dan 2
, masing-masing, yang mirip dengan penggulungan 2d10
(2 dadu 10 sisi). Namun, 1d12 + 1d8
menghasilkan distribusi yang lebih rata daripada 2d10
: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
versus [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
.
Aturan
- Frekuensi harus terdaftar dalam urutan jumlah yang sesuai dengan frekuensi.
- Memberi label frekuensi dengan jumlah yang sesuai diperbolehkan, tetapi tidak diperlukan (karena jumlahnya dapat disimpulkan dari urutan yang diperlukan).
- Anda tidak harus menangani input yang outputnya melebihi kisaran integer yang representatif untuk bahasa Anda.
- Angka nol di depan atau di belakang tidak diizinkan. Hanya frekuensi positif yang akan muncul di output.
- Anda dapat mengambil input dalam format apa pun yang wajar (daftar dadu (
[6, 8, 8]
), daftar pasangan dadu ([[1, 6], [2, 8]]
), dll.). - Frekuensi harus dinormalisasi sehingga GCD dari frekuensinya adalah 1 (misalnya,
[1, 2, 3, 2, 1]
bukan[2, 4, 6, 4, 2]
). - Semua dadu akan memiliki setidaknya satu wajah (jadi a
d1
adalah minimum). - Ini adalah kode-golf , jadi kode terpendek (dalam byte) menang. Celah standar dilarang, seperti biasa.
Uji Kasus
Kasus-kasus uji ini diberikan sebagai input: output
, di mana input diberikan sebagai daftar pasangan yang [a, b]
mewakili a
b
dadu-sisi (sehingga [3, 8]
mengacu pada 3d8
, dan [[1, 12], [1, 8]]
mengacu pada 1d12 + 1d8
).
[[2, 10]]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[[1, 1], [1, 9]]: [1, 1, 1, 1, 1, 1, 1, 1, 1]
[[1, 12], [1, 8]]: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
[[2, 4], [3, 6]]: [1, 5, 15, 35, 68, 116, 177, 245, 311, 363, 392, 392, 363, 311, 245, 177, 116, 68, 35, 15, 5, 1]
[[1, 3], [2, 13]]: [1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 37, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 1]
[[1, 4], [2, 8], [2, 20]]: [1, 5, 15, 35, 69, 121, 195, 295, 423, 579, 761, 965, 1187, 1423, 1669, 1921, 2176, 2432, 2688, 2944, 3198, 3446, 3682, 3898, 4086, 4238, 4346, 4402, 4402, 4346, 4238, 4086, 3898, 3682, 3446, 3198, 2944, 2688, 2432, 2176, 1921, 1669, 1423, 1187, 965, 761, 579, 423, 295, 195, 121, 69, 35, 15, 5, 1]
[[1, 10], [1, 12], [1, 20], [1, 50]]: [1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 285, 360, 444, 536, 635, 740, 850, 964, 1081, 1200, 1319, 1436, 1550, 1660, 1765, 1864, 1956, 2040, 2115, 2180, 2235, 2280, 2316, 2344, 2365, 2380, 2390, 2396, 2399, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2399, 2396, 2390, 2380, 2365, 2344, 2316, 2280, 2235, 2180, 2115, 2040, 1956, 1864, 1765, 1660, 1550, 1436, 1319, 1200, 1081, 964, 850, 740, 635, 536, 444, 360, 285, 220, 165, 120, 84, 56, 35, 20, 10, 4, 1]
Jawaban:
Jelly ,
147 byte-3 bytes terima kasih kepada Tn. Xcoder (penggunaan rentang implisit untuk menghindari memimpin
R
; penggantian pengurangan oleh produk Cartesian diad dan ratakanp/F€
,, dengan produk bawaan Cartesian untuk tujuan ituŒp
,.)Tautan monadik mengambil daftar wajah dadu dan mengembalikan distribusi normal dari jumlah yang meningkat.
Cobalah online!
Bagaimana?
Menelusuri daftar "ukuran" dadu (secara implisit) membuat mereka ke dalam daftar wajah mereka, kemudian mendapatkan produk Cartesian dari daftar tersebut (semua kemungkinan gulungan set dadu), kemudian meringkas gulungan itu, mendapat kelompok-kelompok yang sama indeks (dengan nilai menaik) dan mengambil panjang masing-masing kelompok.
Catatan: hanya ada satu cara untuk menggulung minimum (dengan menggulirkan satu di setiap dadu) dan kami tidak menghitung ganda setiap gulungan, sehingga tidak perlu melakukan normalisasi GCD.
sumber
÷g/$
(bukankah selalu ada satu cara untuk mendapatkan min atau maks?)ŒpS€µLƙ
MATL , 8 byte
Input adalah array ukuran die (mungkin diulang).
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Sekam , 7 byte
Input adalah daftar dadu. Cobalah online!
Penjelasan
sumber
Haskell , 54 byte
Cobalah online!
Haskell , 63 byte
Cobalah online!
Haskell , 68 byte
Cobalah online!
sumber
Oktaf ,
88 69 5856 byteSeperti disebutkan dalam jawaban Haskell, ini menggunakan fakta bahwa distribusi misalnya dadu 3 sisi dan 5 sisi adalah konvolusi diskrit dari dua vektor
[1,1,1]
dan[1,1,1,1,1]
. Terima kasih @LuisMendo untuk pandai golf -11 bytes!Cobalah online!
Pengajuan ini menggunakan pendekatan rekursif. Tetapi jika Anda akan menggunakan loop, itu akan menjadi sedikit lebih lama:
sumber
Haskell ,
80 7864 byteSolusi ini akhirnya hampir sama dengan @ Sherlock9 dalam tantangan sebelumnya dengan pendekatan yang mungkin lebih alami. @xnor memiliki solusi Haskell yang lebih pendek !
Penjelasan:
Cobalah online!
Solusi sebelumnya:
Ini menggunakan fungsi konvolusi diskret @AndersKaseorg . Pengamatan di sini adalah bahwa distribusi misalnya dadu 3 sisi dan 5 sisi adalah konvolusi diskrit dari dua vektor
[1,1,1]
dan[1,1,1,1,1]
.Cobalah online!
sumber
Bahasa Wolfram (Mathematica) , 26 byte
Cobalah online!
Modifikasi jawaban saya untuk tantangan sebelumnya . Ini hanya menghasilkan semua hasil yang mungkin, menambahkannya, dan menghitung hasilnya.
Untuk bersenang-senang, kita bisa menulisnya
Tally@*Total@*Thread@*Tuples@*Range
, tapi itu lebih lama.Bahasa Wolfram (Mathematica) , 41 byte
Cobalah online!
Ini adalah pendekatan berbasis konvolusi (di sini, kami mengambil konvolusi melalui produk fungsi pembangkit -
1+x+x^2+...+x^(N-1)
adalah fungsi pembangkit untuk menggulirkan dN - dan kemudian mengambil daftar koefisien). Saya memasukkannya karena solusi pertama tidak praktis untuk input besar.sumber
Mathematica, 44 byte
Menghasilkan frekuensi yang diberi label dengan jumlah yang sesuai
Cobalah online!
-5 byte dari Martin Ender
terima kasih kepada Misha Lavrov karena memberi tahu saya bahwa "label" itu valid
sumber
Pyth , 12 byte
Coba di sini!
Bagaimana?
sumber
Jelly , 14 byte
Cobalah online!
Input adalah daftar nilai mati. Saya bisa bermain golf ini dengan mencuri
ĠL€
dari jawaban Jelly lainnya tetapi kemudian saya juga bisa bermain golf di babak pertama dan berakhir dengan hal yang sama jadi saya akan membiarkannya seperti itu.sumber
Python 2 ,
120119 byteCobalah online!
Terima kasih untuk Mego / Jonathon Allan selama 1 byte.
sumber
05AB1E , 11 byte
Cobalah online!
Bagaimana itu bekerja
Disimpan 1 byte berkat Emigna !
sumber
O
daripada€˜
R , 51 byte
Cobalah online!
Mengambil daftar dadu dan mengembalikan vektor frekuensi bernama; nama (nilai jumlah dadu) dicetak di atas frekuensi.
R , 59 byte
Cobalah online!
Sebuah
Reduce
pendekatan daripada satu berulang di atas.R , 62 byte
Cobalah online!
Pendekatan konvolusi. Ini akan memberikan beberapa peringatan bahwa itu hanya menggunakan elemen pertama
D
untuk ekspresi1:D
tetapi tidak mempengaruhi output. Jika kita tidak harus mengambil bagianRe
al dari solusi, itu akan menjadi 58 byte.sumber
APL (Dyalog Classic) ,
1210 byte-2 Terima kasih kepada @ Adám
Cobalah online!
input
⎕
adalah daftar N dadu⍳⍵
adalah array N-dimensi dari vektor bersarang - semua kemungkinan lemparan mati+/↑,
meratakan array dan menjumlahkan lemparan⊢∘≢⌸
menghitung berapa banyak dari setiap jumlah unik, yang tercantum dalam urutan penampilan pertama mereka, yang untungnya bertepatan dengan peningkatan urutan merekasumber
⊢∘≢⌸+/↑,⍳⎕
Ruby , 72 byte
Cobalah online!
Mengambil daftar dadu sebagai input. Tidak diragukan lagi itu bisa diturunkan, tetapi tidak terlalu buruk.
sumber
Pari / GP , 37 byte
Cobalah online!
sumber
Bersih ,
15414213610710085 + 13 = 98 byteInput adalah daftar dadu.
Jawabannya dalam bentuk lambda.
+13 byte dari
import StdEnv
, yang mengimpor modul yang diperlukan agar ini berfungsi.Cobalah online!
sumber
JavaScript (ES6), 83 byte
Mengambil input dari setiap die sebagai parameter terpisah.
sumber
JavaScript (ES6),
7674 byteMengambil input sebagai daftar dadu.
Uji kasus
Memproses dua test case terakhir akan membutuhkan untuk mengaktifkan TCO atau meningkatkan batas ukuran stack standar dari mesin JS.
Tampilkan cuplikan kode
Diformat dan dikomentari
NB: Ini adalah versi komentar dari pengiriman awal saya yang menggunakan pengurangan (). Ini 2 byte lebih lama tetapi lebih mudah dibaca.
sumber
Clojure, 96 byte
Input pertama adalah daftar jumlah dadu, dan input kedua adalah daftar jumlah sisi pada setiap dadu.
sumber
Perl 5 , 94 byte
Cobalah online!
Format input adalah daftar dadu yang dipisahkan oleh baris baru. Dengan demikian, 1d10 + 2d8 akan dimasukkan sebagai:
sumber
SageMath, 46 byte
Cobalah online
Ini adalah adaptasi dari solusi saya untuk tantangan lain . Dibutuhkan sejumlah dadu sebagai parameter (misalnya
f(4,4,6,6,6)
untuk2d4+3d6
), dan mengembalikan daftar.Python 2 + NumPy , 62 byte
Cobalah online!
Seperti sebelumnya, saya sudah memasukkan solusi ini dengan yang di atas, karena mereka pada dasarnya setara. Perhatikan bahwa fungsi ini mengembalikan array NumPy dan bukan daftar Python, sehingga outputnya terlihat sedikit berbeda jika Anda
print
menggunakannya.numpy.ones(x)
adalah cara yang "benar" untuk membuat array untuk digunakan dengan NumPy, dan karenanya dapat digunakan sebagai pengganti[x*[1]]
, tapi sayangnya jauh lebih lama.sumber