Hintergrund
Wenn Sie viel Code-Golf spielen, sind Sie sich wahrscheinlich der bitweisen XOR- Operation bewusst . Bei zwei Ganzzahlen gibt es eine weitere Ganzzahl mit 1
s in den Bits, in denen sich die beiden Eingänge unterscheiden. Also zum Beispiel 1010 XOR 0011 = 1001
.
Es erweist sich als sehr nützlich in der Spieltheorie, wo es besser als "Nimsumme" bekannt ist. Wenn Sie die Summe von zwei Spielen haben (dh, Sie bewegen sich in jeweils einem Spiel), ist der Wert der Position die Nimsumme der Werte der Positionen in jedem einzelnen Spiel.
Aber wir können noch einen Schritt weiter gehen. Mit der Addition von nim und einer geeigneten Definition der Multiplikation von nim können wir ein Feld aus den nichtnegativen ganzen Zahlen bilden. Die Herausforderung besteht also darin, nim Multiplikation zu spielen.
Definition
Die Nim-Multiplikation folgt den folgenden Regeln:
Das Nim-Produkt einer Fermat 2-Potenz n = (2 ^ (2 ^ k)) mit einer beliebigen kleineren Zahl ist das gewöhnliche Produkt.
Das Nullprodukt einer Fermat 2-Potenz n mit sich selbst ist 3n / 2.
Die Nim-Multiplikation verteilt sich auf die Nim-Addition.
Die Nim-Multiplikation ist kommutativ und assoziativ (ebenso wie die Nim-Addition).
Die multiplikative Identität ist 1 (und die additive Identität ist 0).
Jede nichtnegative Ganzzahl kann als NIM-Summe der unterschiedlichen Zweierpotenzen und jede Zweierpotenz als Produkt unterschiedlicher Fermat-Zahlen geschrieben werden. Dies ist also ausreichend, um die NIM-Multiplikation für alle nichtnegativen Ganzzahlen zu definieren.
Beispiel
Das war alles ziemlich abstrakt, also lasst uns ein Beispiel durcharbeiten. Ich werde +
zur Bezeichnung der Nim-Addition (XOR) und *
zur Nim-Multiplikation verwenden.
6 * 13
= (4 + 2) * (8 + 4 + 1)
= (4 + 2) * ((4 * 2) + 4 + 1)
= (4 * 4 * 2) + (4 * 2 * 2) + (4 * 4) + (4 * 2) + (4 * 1) + (2 * 1)
= (6 * 2) + (4 * 3) + 6 + 8 + 4 + 2
= ((4 + 2) * 2) + 12 + 6 + 8 + 4 + 2
= (4 * 2) + (2 * 2) + 12 + 6 + 8 + 4 + 2
= 8 + 3 + 12 + 6 + 8 + 4 + 2
= 15
Zusätzliche Testfälle
4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die mit zwei nichtnegativen ganzen Zahlen in beliebiger Form ihr NIM-Produkt berechnet.
Dies ist Code-Golf , also gewinnt die kürzeste Einreichung.
Antworten:
Nim , 120 Bytes
Probieren Sie es online!
OK, das mag verrückt sein, aber jemand musste Nim-Multiplikation in Nim machen ...
Dies ist ein Standardalgorithmus von Wikipedia. Das Problem ist, dass ich die Sprache nicht kenne und die Grundlagen schnell lernen musste. Insbesondere war ich überrasche , dass
-=
undmin
nicht für Sätze funktionieren, und der beste Weg , ich war zum Extrahieren des Minimums finden verwalten den Iterator zu verwenden und den ersten Wert zurück. Hoffentlich helfen mir Nim-Experten dabei, dies zu verbessern.quelle
Python 2 , 85 Bytes
Probieren Sie es online!
Langsam wie zum Teufel. Berechnet rekursiv mex ({α ′ β ⊕ α β ′ ⊕ α ′ β ′: α ′ <α, β ′ <β}) .
quelle
Gelee , 16 Bytes
Verwendet die rekursive Formel xy = mex ({ay ⊕ xb ⊕ ab: a <x, b <y}) für die Zahlenmultiplikation .
Probieren Sie es online!
Wie es funktioniert
quelle
CGSuite ,
523922 BytesWusste nicht, dass es diese eingebauten und anonymen "Prozeduren" hat.
Originalversion, 36 Bytes:
Oder 25 Bytes, wenn die Eingabe / Ausgabe Zahlen sein könnte:
Nun, ich habe gehofft
*a**b
/a*b
zu arbeiten, aber das tut es nicht.quelle
Pyth , 21 Bytes
Demonstration
Verwendet das Minimum ausgeschlossen Element Formulierung von nim Multiplikation, als gegeben hier .
Zwei verschachtelte Maps werden verwendet, um alle kleineren Werte zu durchlaufen (
mm ... GH
). Anschließend werden die Ergebnisse abgeflacht (s
). Der clevere Teil kommt mitf-T ... 0
, bei dem wir ganze Zahlen von 0 nach oben durchlaufen, um den ersten Teil zu finden, der nicht in der oben genannten Menge enthalten ist. Auf diese Weise müssen wir keine obere Iterationsgrenze berechnen und ein paar Bytes einsparen.Am Ende
g
berechnet die Funktion das NIM-Produkt.quelle
JavaScript (ES6),
142128 BytesDer erste Schritt besteht darin, beide
x
undy
in ein XOR von Potenzen aufzuteilen2
, ihre paarweisen NIM-Produkte zu nehmen und dann die Ergebnisse zu XOR (da sich das NIM-Produkt über XOR verteilt). Sobald wir auf den Fall rekursiv habenx
undy
beide Potenzen von 2, stellen wir fest, dass Fermat Kräfte mehrfach miteinander unter Verwendung von gewöhnlichen Arithmetik, so können wir daher faktorisierenx
undy
in Fermat Kräfte. Wenn Sie eine Fermat-Kraft habenx
undy
diese nicht teilen, können Sie den Vorgang umkehren und einfach zurückkehrenx * y
. Wenn sie jedoch eine Fermat-Potenz teilen, teilen wir beidex
undy
durch diese Potenz berechnen wir das Nim-Produkt und nehmen dann das Nim-Produkt mit dem Nim-Quadrat dieser Fermat-Potenz. Ungolfed:quelle
Wolfram Language (Mathematica) , 81 Byte
Probieren Sie es online!
Mit der Formel:
quelle