Zeit für eine weitere leichte Herausforderung, an der alle teilnehmen können!
Der Ausdruck in Klammern ist der Multinomialkoeffizient, definiert als:
Wenn man zulässt, dass die Terme k i über alle ganzzahligen Partitionen von n reichen, erhält man das n- te Niveau von Pascals m- Simplex. Ihre Aufgabe ist es, diesen Koeffizienten zu berechnen.
Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die m Zahlen, n , k 1 , k 2 , ..., k m-1 annimmt und den entsprechenden Multinomialkoeffizienten ausgibt oder zurückgibt. Ihr Programm kann gegebenenfalls m als zusätzliches Argument verwenden. Beachten Sie, dass k m nicht in der Eingabe ist.
Diese Zahlen können in einem beliebigen Format eingegeben werden, zum Beispiel in Listen gruppiert oder in Unary oder irgendetwas anderem codiert, solange die eigentliche Berechnung des Multinomialkoeffizienten von Ihrem Code durchgeführt wird und nicht der Codierungsprozess.
Das Ausgabeformat ist ähnlich flexibel.
Der gesamte Code sollte in weniger als einer Minute für n und m bis 1000 ausgeführt werden.
Sorgen Sie sich nicht um einen Ganzzahlüberlauf.
Integrierte Funktionen zur Berechnung des Multinomialkoeffizienten sind nicht zulässig.
Es gelten Standardlücken.
Wertung
Das ist Codegolf: Kürzeste Lösung in Bytes gewinnt.
Testfälle
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
quelle
1934550571913396675776550070308250
können wir ausgeben1.9345505719133966e+33
?[1000 {999 ones}]
, da der Exponent weit über dem Wert liegt, den 64-Bit-Floats darstellen können. (128-Bit-Floats werden wahrscheinlich ausreichen, aber ich gehe davon aus, dass Sie den nativen Zahlentyp von JavaScript verwenden möchten?)Antworten:
Gelee ,
76 BytesSchau ma, kein Unicode! Dieses Programm verwendet eine einzelne Liste als Eingabe, wobei sich n am ersten Index befindet.
Probieren Sie es online! oder überprüfen Sie alle Testfälle auf einmal .
Wie es funktioniert
quelle
CJam, 11 Bytes
Eingabe als einzelne Liste mit
n
zuerst:Diese Griffe gibt bis zu
n
undm
1000 so ziemlich sofort.Teste es hier.
Erläuterung
quelle
MATL , 21
15BytesLassen Sie uns die Log-Gamma-Funktion sinnvoll einsetzen. Dies vermeidet internes Überlaufen, indem mit Logarithmen von Fakultäten gearbeitet wird, nicht mit Fakultäten selbst.
Dies funktioniert in der aktuellen Version (9.2.2) der Sprache / des Compilers, die / der früher als diese Herausforderung ist.
Eingaben sind: zuerst eine Zahl, dann ein numerischer Vektor. Das Ergebnis wird als erzeugt
double
, was die maximale Ausgabe auf irgendwo begrenzt2^52
.Beispiel
Erläuterung
quelle
PowerShell,
91 bis74 ByteWoo! Meine 100. Antwort auf PPCG!
Wütend. Den kürzesten Code nicht gewinnen, das ist sicher. Verwendet jedoch ein paar nette Tricks mit Reichweiten. Und dies ist wahrscheinlich ein völliger Kauderwelsch für alle, die nicht mit PowerShell vertraut sind.
Erläuterung
Zuerst nehmen wir Eingaben mit
param($n,$k)
und erwarten$k
, dass es sich um ein Array handelt, z.\compute-the-multinomial-coefficient.ps1 11 @(1,4,4)
.Wir beginnen mit dem Zähler (alles links von
/
). Das ist einfach ein Bereich1..$n
, der-join
zusammen mit berechnet*
und dann mit ausgewertet wurdeiex
, um die Fakultät (dh1*2*3*...*$n
) zu berechnen .Als nächstes wir Schleife über
$k|%{...}
und jede Iteration wir den aktuellen Wert subtrahieren$_
aus$n
(die wir uns nicht mehr kümmern) zu formulieren$k_m
später. Zusätzlich generieren wir den Bereich für1..$k_i
jede Iteration, die in der Pipeline verbleibt. Diese Pipeline-Objekte werden mit dem zweiten Ausdruck, range1..$n
(der sich$k_m
an dieser Stelle befindet) , durch Arrays verknüpft . All dies wird schließlich-join
zusammen mit dem Zähler bearbeitet*
und ausgewertetiex
(dies funktioniert, dax! * y! = 1*2*3*...*x * 1*2*3*...*y
wir uns nicht um die Einzelbestellung kümmern).Schließlich
/
passiert das, der Zähler wird durch den Nenner geteilt und ausgegeben.Verarbeitet die Ausgabe korrekt für größere Zahlen, da wir keine Variablen explizit als bestimmte Datentypen umwandeln, sodass PowerShell bei Bedarf automatisch die verschiedenen Datentypen umwandelt. Bei den größeren Zahlen werden die Ausgaben in wissenschaftlicher Notation ausgegeben, um die signifikanten Zahlen zu erhalten, wenn die Datentypen neu umgewandelt werden. Zum Beispiel
.\compute-the-multinomial-coefficient.ps1 55 @(28)
wird ausgegeben3.82434530038022E+15
. Ich bin Vermutung dies in Ordnung sein gegeben „Ausgabeformat ist ähnlich flexibel“ ist in der Herausforderung und quintopia Kommentaren angegeben „Wenn das Endergebnis in der nativ unterstützt paßt Integer - Typ, dann muss das Ergebnis genau sein. Wenn es nicht kann, da ist keine Einschränkung, was ausgegeben werden darf. "Alternative
Abhängig von den Ausgabeformatierungsentscheidungen beträgt die Anzahl der Bytes 92
Welches ist das gleiche wie oben, nur verwendet explizite Ausgabe Formatierung mit
.ToString('G17')
der gewünschten Anzahl von Stellen zu erreichen. Dafür55 @(28)
wird ausgegeben3824345300380220.5
Edit1 - Speichert 17 Bytes, indem es entfernt
$d
und nur direkt berechnet wird, und entfernt die Berechnung,$k_m
indem es in einer Schleife$k
aneinander gereiht wird. Edit2 - Alternative Version mit expliziter Formatierung hinzugefügt
quelle
APL (Dyalog Extended) , 9 Bytes
Probieren Sie es online!
Verwenden Sie die Idee aus meiner APL-Antwort für eine andere Herausforderung, die Multinomialzahlen umfasst .
Eine implizite Funktion, deren linkes Argument die Liste von k ist und deren rechtes Argument n ist. Die Testfälle prüfen, ob sie mit Adams Lösung übereinstimmen, wobei die linken und rechten Argumente vertauscht werden.
Wie es funktioniert
quelle
Mathematica, 26 Bytes
Beispiel:
quelle
Python 3,
9391Danke an Dennis und FryAmTheEggman .
n
als ganze Zahl,k
wie iterabel.Ungolfed:
quelle
95, [65, 4, 4]
. Beachten Sie, dass die Eingabe k_m nicht enthält . 2. Sie scheinen überhaupt nicht zu verwendenfrom functools import*
.reduce
. 2.import math;f=math.factorial
speichert ein Byte. 3. Mit Python 2 können Sie die Sekunde/
in loswerden//
.f
auf Ihrem eigenen spart einige Bytes :f=lambda x:0**x or x*f(x-1)
.APL (Dyalog Unicode) , 16 Byte SBCS
Ganz basierend auf den mathematischen Fähigkeiten meines Kollegen Marshall .
Anonyme Infix-Funktion. Nimmt k als rechtes Argument und n als linkes Argument.
Probieren Sie es online!
{
…}
Anonymes Lambda;⍺
ist linkes Argument ( n ) und⍵
rechtes Argument ( k )0,⍵
stelle k eine Null voran¯1↓
Lass den letzten Gegenstand davon fallen+\
kumulative Summe davon⍺-
subtrahiere das von n⍵!
( k ) das×/
Produkt davonquelle
PARI / GP, 43 Bytes
Ziemlich einfach; Abgesehen von der Formatierung ist die unbenutzte Version möglicherweise identisch.
quelle
Matlab 48 Bytes
Sie müssen Set
format
zulong
im Voraus die höhere Genauigkeit zu erhalten. Dann ist es ganz einfach:quelle
Pyth, 10 Bytes
Probieren Sie es online aus: Demonstration
Erläuterung:
quelle
J, 16 Bytes
Verwendung
Bei größeren Werten wird ein Suffix von
x
verwendet, um Ganzzahlen mit erweiterter Genauigkeit zu kennzeichnen.Erläuterung
quelle
05AB1E , 8 Bytes
Probieren Sie es online! Erläuterung:
Ich kann anscheinend keine besseren Möglichkeiten finden, um Schritt 2 oder Schritt 4 durchzuführen.
quelle
APL (Dyalog Unicode) , 17 Byte
Probieren Sie es online!
Infix tacit function (Danke an @ Adám für die 2 Bytes, die es speichert.)
APL (Dyalog Unicode) , 19 Byte
Probieren Sie es online!
Infix Dfn.
Beide oben genannten Funktionen berechnen die angegebene Formel.
quelle
Haskell ,
59-58BytesProbieren Sie es online!
Danke an BMO für das Speichern von 1 Byte!
quelle
Clojure, 70 Bytes
Erstellt eine anonyme Funktion, die alle Argumente als eine einzige Liste mit
n
first verwendet werden.30 Zeichen werden "verschwendet", um die verdammte Fakultätsfunktion zu definieren. Naja.
quelle
Perl 6 ,
5250 BytesProbier es aus
Teste es (Ergebnis ist ein Rational mit Nenner von 1)
Erweitert:
quelle