Contexte
Si vous jouez beaucoup au code, vous êtes probablement au courant de l' opération XOR au niveau du bit . Étant donné deux entiers, il donne un autre entier avec 1s dans les bits où les deux entrées diffèrent. Ainsi, par exemple 1010 XOR 0011 = 1001,.
Il s'avère très utile dans la théorie des jeux, où il est mieux connu sous le nom de «nim sum». Si vous avez la somme de deux jeux (c'est-à-dire que vous effectuez des mouvements dans un jeu à la fois), la valeur de la position est la somme nim des valeurs des positions dans chaque jeu individuel.
Mais nous pouvons aller plus loin. Avec l'addition nim et une définition appropriée de la multiplication nim , nous pouvons former un champ à partir des entiers non négatifs. Le défi consiste donc à multiplier les nim au golf.
Définition
La multiplication Nim obéit aux règles suivantes:
Le produit nim d'un Fermat 2-puissance n = (2 ^ (2 ^ k)) avec un nombre plus petit est le produit ordinaire.
Le produit nim d'un n de Fermat 2-power est lui-même 3n / 2.
La multiplication Nim distribue sur l'addition nim.
La multiplication Nim est commutative et associative (tout comme l'addition nim).
L'identité multiplicative est 1 (et l'identité additive est 0).
Tout entier non négatif peut être écrit comme la somme nim de puissances distinctes de deux, et toute puissance de deux peut être écrite comme le produit de nombres Fermat distincts, donc cela suffit pour définir la multiplication nim pour tous les entiers non négatifs.
Exemple
Tout cela était assez abstrait, alors travaillons à travers un exemple. Je vais utiliser +pour désigner l'addition nim (XOR) et *pour la multiplication nim.
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
Cas de test supplémentaires
4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42
Défi
Écrivez un programme ou une fonction qui, étant donné deux entiers non négatifs sous n'importe quelle forme pratique, calcule leur produit nim.
C'est du golf de code , donc la soumission la plus courte l'emporte.