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 1s 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.