Antecedentes
Si hace mucho golf de código, es probable que conozca la operación XOR bit a bit . Dados dos enteros, da otro entero con 1
s en los bits donde las dos entradas difieren. Entonces, por ejemplo 1010 XOR 0011 = 1001
,.
Resulta ser muy útil en la teoría de juegos, donde se conoce mejor como la "suma nim". Si tiene la suma de dos juegos (es decir, está haciendo movimientos en un juego a la vez), el valor de la posición es la suma mínima de los valores de las posiciones en cada juego individual.
Pero podemos llevar esto un paso más allá. Con la suma de nim y una definición apropiada de multiplicación de nim , podemos formar un campo a partir de los enteros no negativos. Entonces, el desafío es la multiplicación de nim de golf.
Definición
La multiplicación de Nim obedece las siguientes reglas:
El producto nim de un Fermat 2-power n = (2 ^ (2 ^ k)) con cualquier número menor es el producto ordinario.
El producto nim de un Fermat 2-power n consigo mismo es 3n / 2.
La multiplicación de nim se distribuye sobre la suma de nim.
La multiplicación de nim es conmutativa y asociativa (como lo es la adición de nim).
La identidad multiplicativa es 1 (y la identidad aditiva es 0).
Cualquier número entero no negativo se puede escribir como la suma nim de potencias distintas de dos, y cualquier potencia de dos se puede escribir como el producto de números Fermat distintos, por lo que esto es suficiente para definir la multiplicación nim para todos los números enteros no negativos.
Ejemplo
Todo fue bastante abstracto, así que analicemos un ejemplo. Usaré +
para denotar la suma de nim (XOR) y *
para la multiplicación de 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
Casos de prueba adicionales
4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42
Desafío
Escriba un programa o función que, dados dos enteros no negativos en cualquier forma conveniente, calcule su producto nim.
Este es el código de golf , por lo que gana la presentación más corta.