quintopia hat hier eine Herausforderung zur Berechnung multinomialer Koeffizienten veröffentlicht (ein Teil des Textes hier wird von dort kopiert). Es gibt einen unterhaltsamen Algorithmus zur Berechnung von Multinomialkoeffizienten mod 2.
Ausgehend von einer Liste von Zahlen, k 1 , k 2 , ..., k m , wird der Rest des Multinomialkoeffizienten ausgegeben:
Der folgende Algorithmus führt dies effizient aus: Berechne für jedes k i die binäre Expansion von k i , dh finde ein ij, so dass jedes a ij entweder 1 oder 0 ist und
Wenn es irgendein j gibt, so dass ein rj = ein sj = 1 für r ≠ s ist, dann ist der zugehörige multinomiale Koeffizient von mod 2 0, andernfalls ist der multinomiale Koeffizient von mod 2 1.
Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die m Zahlen, k 1 , k 2 , ..., k m , annimmt und den entsprechenden Multinomialkoeffizienten ausgibt oder zurückgibt. Ihr Programm kann gegebenenfalls m als zusätzliches Argument verwenden.
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.
Die Ausgabe kann ein beliebiger Wahrheitswert sein, wenn der Multinomialkoeffizient ungerade ist, und ein beliebiger Falschwert, wenn der Multinomialkoeffizient gerade ist.
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.
Beispiele:
Um den Multinomialkoeffizienten von 7, 16 und 1000 zu ermitteln, erweitern wir jeden von ihnen binär:
Da keine Spalte mehr als eine 1 hat, ist der Multinomialkoeffizient ungerade, und daher sollten wir etwas Wahres ausgeben.
Um den Multinomialkoeffizienten von 7, 16 und 76 zu ermitteln, erweitern wir jeden von ihnen binär:
Da sowohl 76 als auch 7 eine 4 in ihrer binären Expansion haben, ist der Multinomialkoeffizient gerade und wir geben einen Falsey-Wert aus.
Testfälle:
Input: [2, 0, 1]
Output: Truthy
Input: [5,4,3,2,1]
Output: Falsey
Input: [1,2,4,8,16]
Output: Truthy
Input: [7,16,76]
Output: Falsey
Input: [7,16,1000]
Output: Truthy
Input: [545, 1044, 266, 2240]
Output: Truthy
Input: [1282, 2068, 137, 584]
Output: Falsey
Input: [274728976, 546308480, 67272744, 135004166, 16790592, 33636865]
Output: Truthy
Input: [134285315, 33849872, 553780288, 544928, 4202764, 345243648]
Output: Falsey
quelle
==
gleichberechtigte Sprachen hätten ein Byte sparen können, wenn Wahrheit und Falschheit umgedreht worden wären.Antworten:
Gelee , 4 Bytes
Probieren Sie es online!
Testen Sie, ob die Summe der bitweisen oder der Summe (dh
a+b+c == a|b|c
) entspricht.quelle
Python
32,554342 Bytes-12 Bytes von Mr. Xcoder
-1 Byte von Rod
Probieren Sie es online!
Erläuterung: Überprüft, ob die Summe der Zahlen der bitweisen oder der Zahlen entspricht.
quelle
lambda l:sum(l)==eval("|".join(map(str,l)))
Python 2 , 37 Bytes
Probieren Sie es online!
Ein weiterer Port des Algorithmus von pizzapants184 ...
quelle
Sauber , 38 Bytes
Probieren Sie es online!
Noch ein Hafen.
quelle
Japt, 6 Bytes
Ein weiterer Port der Lösungen von pizzapants184 & Leaky Nun.
Probier es aus
quelle
JavaScript (ES6),
373534 Bytes2 Bytes gespart dank @ Mr.Xcoder
gespeichert 1 Byte dank @ETHproductions gespeichert
Der Vergleich der Summe mit dem bitweisen OR (wie es pizzapants184 und Leaky Nun taten) ist
134 Bytes kürzer als mein ursprünglicher Ansatz:Testfälle
Code-Snippet anzeigen
Alt. Version, 38 Bytes
Testfälle
Code-Snippet anzeigen
quelle
a=>(q=c=>eval(a.join(c)))`|`==q`+`;
Haskell , 38 Bytes
(==).sum<*>foldl1 xor
ist eine anonyme Funktion, die a zurückgibtBool
. Verwenden Sie als((==).sum<*>foldl1 xor) [2,0,1]
.Probieren Sie es online!
Ziemlich derselbe Trick von pizzapants184 und Leaky Nun, den jeder verwendet, mit der Ausnahme, dass bei Haskell-Operatorenamen ein Byte für die Verwendung von (bitweise)
xor
anstelle von(.|.)
(bitweise oder) gespart wird .(==).sum<*>foldl1 xor
ist eine punktefreie Version von\l->sum l==foldl1 xor l
.quelle
Java 8, 53 Bytes
Port von @LeakyNuns Jelly Antwort .
Erläuterung:
Probieren Sie es hier aus.
quelle
Pyth , 6 Bytes
Test Suite.
quelle
Schale , 5 Bytes
Probieren Sie es online!
quelle
Perl 6 , 15 Bytes
Probier es aus
Erweitert:
quelle
Rot , 78 Bytes
Wie es funktioniert:
Ungolfed:
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 15 Byte
Probieren Sie es online!
quelle
Batch, 73 Bytes
Ausgänge
1
für Wahres, nichts für Falsches. Eine weitere offensichtliche Portierung des Algorithmus von pizzapants184 / Leaky Nun.quelle
J 10 Bytes
Noch eine Portierung der Lösungen von pizzapants184 & Leaky Nun.
Wie es funktioniert?
+/.&.#:
- wandle die Zahlen in Binärzahlen um, wende sie bitweise oder in Zweierpotenzen an und wandle sie von Binärzahlen in Dezimalzahlen um+/
- Reduzieren Sie die Eingabe durch Addition=
- Sind die oben genannten gleich?Probieren Sie es online!
Einfache Alternative
J , 12 Bytes
Wie es funktioniert?
+/@#:
- Wandle jede Zahl in Binär um und finde die Summe jeder Potenz von 2>./
- finde das Maximum2>
- ist es weniger als 2? -> wahrProbieren Sie es online!
quelle
Dreieckigkeit , 31 Bytes
Probieren Sie es online!
Alternative Lösung, 31 Byte
Probieren Sie es online!
quelle