Saatnya untuk tantangan mudah lainnya di mana semua dapat berpartisipasi!
Teorema multinomial menyatakan:
Ekspresi dalam tanda kurung adalah koefisien multinomial, didefinisikan sebagai:
Mengizinkan istilah k i untuk menjangkau semua partisi integer dari n memberikan level ke- n dari m -simplex Pascal . Tugas Anda adalah menghitung koefisien ini.
Tugas
Tulis program atau fungsi yang mengambil angka m , n , k 1 , k 2 , ..., k m-1 , dan menghasilkan atau mengembalikan koefisien multinomial yang sesuai. Program Anda secara opsional dapat menganggap m sebagai argumen tambahan jika perlu. Perhatikan bahwa k m tidak ada dalam input.
Angka-angka ini dapat dimasukkan dalam format apa pun yang disukai, misalnya dikelompokkan ke dalam daftar atau disandikan di unary, atau apa pun, selama perhitungan aktual dari koefisien multinomial dilakukan oleh kode Anda, dan bukan proses pengkodean.
Format output juga fleksibel.
Semua kode harus berjalan dalam waktu kurang dari satu menit untuk n dan m hingga 1000.
Jangan khawatir tentang integer overflow.
Built-in yang dirancang untuk menghitung koefisien multinomial tidak diperbolehkan.
Celah standar berlaku.
Mencetak gol
Ini adalah kode golf: Solusi terpendek dalam byte yang menang.
Uji kasus
Input: 3, [2, 0]
Output: 3
Input: 3, [1, 1]
Output: 6
Input: 11, [1, 4, 4]
Output: 34650
Input: 4, [1,2]
Output: 12
Input: 15, [5,4,3,2]
Output: 37837800
Input: 95, [65,4,4]
Output: 1934550571913396675776550070308250
Input: 32, [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
Output: 4015057936610313875842560000000
Input: 15, [3,3,3,3]
Output: 168168000
Input: 1000, [10,10,10,10,10,10,10,10,10,10,100,100,100,100,100,100,100,100]
Output: 1892260836114766064839886173072628322819837473493540916521650371620708316292211493005889278395285403318471457333959691477413845818795311980925098433545057962732816261282589926581281484274178579110373517415585990780259179555579119249444675675971136703240347768185200859583936041679096016595989605569764359198616300820217344233610087468418992008471158382363562679752612394898708988062100932765563185864346460326847538659268068471585720069159997090290904151003744735224635733011050421493330583941651019570222984959183118891461330718594645532241449810403071583062752945668937388999711726969103987467123014208575736645381474142475995771446030088717454857668814925642941036383273459178373839445456712918381796599882439216894107889251444932486362309407245949950539480089149687317762667940531452670088934094510294534762190299611806466111882595667632800995865129329156425174586491525505695534290243513946995156554997365435062121633281021210807821617604582625046557789259061566742237246102255343862644466345335421894369143319723958653232683916869615649006682399919540931573841920000000000000
Input: 33, [17]
Output: 1166803110
Input: 55, [28]
Output: 3824345300380220
sumber
1934550571913396675776550070308250
, bisakah kita menghasilkan1.9345505719133966e+33
?[1000 {999 ones}]
sama sekali, karena eksponen jauh melampaui apa yang bisa diwakili oleh float 64-bit. (Pelampung 128-bit mungkin sudah cukup, tapi saya berasumsi Anda ingin menggunakan jenis nomor asli JavaScript?)Jawaban:
Jelly ,
76 byteLihat bu, tidak ada Unicode! Program ini mengambil satu daftar sebagai input, dengan n pada indeks pertamanya.
Cobalah online! atau verifikasi semua kasus uji sekaligus .
Bagaimana itu bekerja
sumber
CJam, 11 byte
Masukan sebagai daftar tunggal dengan yang
n
pertama:Ini menangani input hingga
n
danm
1000 cukup banyak secara instan.Uji di sini.
Penjelasan
sumber
MATL , 21
15byteMari kita gunakan fungsi log-gamma dengan baik. Ini menghindari internal yang meluap dengan bekerja dengan logaritma faktorial, bukan dengan faktorial itu sendiri.
Ini berfungsi dalam versi saat ini (9.2.2) dari bahasa / kompiler, yang lebih awal dari tantangan ini.
Inputnya adalah: pertama angka, lalu vektor numerik. Hasilnya diproduksi sebagai
double
, yang membatasi output maksimum di suatu tempat di sekitar2^52
.Contoh
Penjelasan
sumber
PowerShell,
9174 byteMerayu! Jawaban ke-100 saya di PPCG!
Wah. Tidak akan memenangkan kode terpendek, itu sudah pasti. Namun, gunakan beberapa trik yang rapi dengan rentang. Dan ini mungkin omong kosong lengkap bagi siapa pun yang tidak terbiasa dengan PowerShell.
Penjelasan
Pertama kita mengambil input dengan
param($n,$k)
dan berharap$k
menjadi array, mis.\compute-the-multinomial-coefficient.ps1 11 @(1,4,4)
.Kami akan mulai dengan pembilang (semuanya di sebelah kiri
/
). Itu hanya rentang dari1..$n
yang telah-join
disatukan dengan*
dan kemudian dievaluasi denganiex
untuk menghitung faktorial (yaitu,1*2*3*...*$n
).Selanjutnya, kita mengulang
$k|%{...}
dan setiap iterasi kita kurangi nilai saat ini$_
dari$n
(yang kita tidak peduli lagi) untuk dirumuskan$k_m
nanti. Selain itu, kami menghasilkan rentang1..$k_i
setiap iterasi, yang tersisa di jalur pipa. Objek-objek pipa mendapatkan array-concatenated dengan ekspresi kedua, range1..$n
(yang$k_m
pada titik ini). Semua itu akhirnya-join
diedit bersama*
dan dievaluasi denganiex
, mirip dengan pembilang (ini berfungsi karenax! * y! = 1*2*3*...*x * 1*2*3*...*y
, jadi kami tidak peduli tentang pemesanan individu).Akhirnya, yang
/
terjadi, pembilang dibagi dengan penyebut, dan keluaran.Menangani keluaran dengan benar untuk angka yang lebih besar, karena kami tidak secara eksplisit menampilkan variabel apa pun sebagai tipe data tertentu, sehingga PowerShell akan secara diam-diam menampilkan kembali tipe data yang berbeda saat diperlukan. Untuk angka yang lebih besar, keluaran melalui notasi ilmiah untuk mempertahankan angka-angka penting dengan baik ketika datatypes kembali dicetak. Sebagai contoh,
.\compute-the-multinomial-coefficient.ps1 55 @(28)
akan menampilkan3.82434530038022E+15
. Saya menganggap ini OK karena "Format output juga fleksibel" ditentukan dalam tantangan dan komentar quintopia "Jika hasil akhir dapat masuk dalam tipe bilangan bulat yang didukung secara native, maka hasilnya harus akurat. Jika tidak bisa, ada tidak ada batasan pada apa yang mungkin menjadi output. "kalau tidak
Bergantung pada keputusan pemformatan output, berikut pada 92 byte
Yang sama seperti di atas, hanya menggunakan format output eksplisit dengan
.ToString('G17')
untuk mencapai jumlah digit yang diinginkan. Untuk55 @(28)
ini akan menampilkan3824345300380220.5
Sunting1 - Disimpan 17 byte dengan menyingkirkan
$d
dan hanya menghitungnya secara langsung, dan menyingkirkan perhitungan untuk$k_m
dengan merangkai bersama sementara kita mengulangi$k
Edit2 - Menambahkan versi alternatif dengan pemformatan eksplisit
sumber
APL (Dyalog Extended) , 9 byte
Cobalah online!
Menggunakan ide dari APL saya menjawab pada tantangan lain yang melibatkan multinomial .
Fungsi diam-diam yang argumen kiri adalah daftar k, dan argumen kanan adalah n. Kasus uji memeriksa apakah itu setuju dengan solusi Adam dengan argumen kiri dan kanan terbalik.
Bagaimana itu bekerja
sumber
Mathematica, 26 byte
Contoh:
sumber
Python 3,
9391Terima kasih untuk Dennis dan FryAmTheEggman .
n
sebagai integer,k
seperti iterable.Tidak Disatukan:
sumber
95, [65, 4, 4]
. Perhatikan bahwa input tidak mengandung k_m . 2. Anda sepertinya tidak menggunakanfrom functools import*
sama sekali.reduce
. 2.import math;f=math.factorial
menyimpan satu byte. 3. Python 2 akan memungkinkan Anda untuk menyingkirkan kedua/
di//
.f
sendiri menyimpan beberapa byte :f=lambda x:0**x or x*f(x-1)
.APL (Dyalog Unicode) , 16 byte SBCS
Seluruhnya didasarkan pada keterampilan matematika rekan saya Marshall .
Fungsi infiks anonim. Membawa k sebagai argumen kanan dan n sebagai argumen kiri.
Cobalah online!
{
...}
lambda anonim;⍺
adalah argumen kiri ( n ) dan⍵
argumen benar ( k )0,⍵
tambahkan nol ke k¯1↓
jatuhkan item terakhir dari itu+\
jumlah kumulatif itu⍺-
kurangi dari n⍵!
( k ) itu×/
produk itusumber
PARI / GP, 43 byte
Cukup mudah; selain dari pemformatan, versi yang tidak serigala mungkin identik.
sumber
Matlab 48 byte
Anda perlu set
format
untuklong
di muka untuk mendapatkan presisi yang lebih tinggi. Kemudian, cukup mudah:sumber
Pyth, 10 byte
Cobalah online: Demonstrasi
Penjelasan:
sumber
J, 16 byte
Pemakaian
Untuk nilai yang lebih besar, sufiks
x
digunakan untuk menunjukkan bilangan bulat presisi yang diperluas.Penjelasan
sumber
05AB1E , 8 byte
Cobalah online! Penjelasan:
Saya sepertinya tidak bisa menemukan cara yang lebih baik untuk melakukan langkah 2 atau langkah 4.
sumber
APL (Dyalog Unicode) , 17 byte
Cobalah online!
Fungsi infix diam-diam (Terima kasih kepada @ Adám untuk 2 byte yang dihematnya.)
APL (Dyalog Unicode) , 19 byte
Cobalah online!
Infix Dfn.
Kedua fungsi di atas menghitung rumus yang diberikan.
sumber
Haskell ,
5958 byteCobalah online!
Terima kasih kepada BMO untuk menghemat 1 byte!
sumber
Clojure, 70 byte
Membuat fungsi anonim dengan mengambil semua argumen sebagai satu daftar, dengan yang
n
pertama.30 karakter "terbuang" hanya mendefinisikan fungsi faktorial. Baiklah.
sumber
Perl 6 ,
5250 byteMenguji
Mengujinya (hasilnya adalah Rasional dengan penyebut 1)
Diperluas:
sumber