fundo
Se você pratica muito código de golfe, provavelmente conhece a operação XOR bit a bit . Dados dois números inteiros, ele fornece outro número inteiro com 1
s nos bits, onde as duas entradas diferem. Então, por exemplo 1010 XOR 0011 = 1001
,.
Isso acaba sendo muito útil na teoria dos jogos, onde é mais conhecida como "nim sum". Se você tiver a soma de dois jogos (ou seja, você está fazendo movimentos em um jogo de cada vez), o valor da posição é a soma nim dos valores das posições em cada jogo individual.
Mas podemos dar um passo adiante. Com a adição de nim e uma definição apropriada de multiplicação de nim , podemos formar um campo a partir de números inteiros não negativos. Portanto, o desafio é multiplicar o golfe.
Definição
A multiplicação de nim obedece às seguintes regras:
O produto nim de uma Fermat 2-potência n = (2 ^ (2 ^ k)) com qualquer número menor é o produto comum.
O produto nim de um Fermat 2-power n é 3n / 2.
A multiplicação de nim distribui sobre a adição de nim.
A multiplicação de nim é comutativa e associativa (como é a adição de nim).
A identidade multiplicativa é 1 (e a identidade aditiva é 0).
Qualquer número inteiro não negativo pode ser escrito como a soma nim de potências distintas de dois e qualquer potência de dois pode ser escrito como o produto de números Fermat distintos, portanto, isso é suficiente para definir a multiplicação de nim para todos os números inteiros não negativos.
Exemplo
Isso foi tudo bastante abstrato, então vamos trabalhar com um exemplo. Vou usar +
para denotar disso nim (XOR) e *
para a multiplicação 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 teste adicionais
4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42
Desafio
Escreva um programa ou função que, dados dois inteiros não negativos em qualquer forma conveniente, calcule seu produto nim.
Este é o código-golfe , pelo que o envio mais curto vence.
Respostas:
Nim , 120 bytes
Experimente online!
OK, isso pode ser uma loucura, mas alguém tinha que fazer multiplicação Nim em Nim ...
Este é um algoritmo padrão da Wikipedia. O problema é que eu não conheço o idioma, então tive que aprender o básico rapidamente. Em particular, fiquei surpreso que
-=
emin
não funcionou para conjuntos, e a melhor maneira que conseguiu encontrar para extrair o mínimo era usar o iterador e retornar o primeiro valor. Felizmente, os especialistas em Nim me ajudarão a melhorar isso.fonte
Python 2 , 85 bytes
Experimente online!
Lento como o diabo. Calcula mex ({α ′ β ⊕ α β ′ ⊕ α 'β ′: α ′ <α, β ′ <β}) recursivamente.
fonte
Gelatina , 16 bytes
Usa a fórmula recursiva xy = mex ({ay xb ⊕ ab: a <x, b <y}) para multiplicação de nimber .
Experimente online!
Como funciona
fonte
CGSuite ,
5239.22 bytesNão sabia que ele tinha esse "procedimento" interno e anônimo.
Versão original, 36 bytes:
Ou 25 bytes, se a entrada / saída puder ser nimbers:
Bem, eu esperava
*a**b
/a*b
trabalhar, mas não funciona.fonte
Pitão , 21 bytes
Demonstração
Usa a formulação mínima de elementos excluídos da multiplicação nim, conforme indicado aqui .
Dois mapas aninhados são usados para iterar sobre todos os valores menores (
mm ... GH
), e os resultados são achatados (s
). A parte inteligente vem comf-T ... 0
, onde iteramos números inteiros para cima de 0 para encontrar o primeiro não contido no conjunto mencionado acima. Fazendo dessa maneira, não precisamos calcular um limite superior da iteração, economizando alguns bytes.No final, a função
g
calcula o produto nim.fonte
JavaScript (ES6),
142128 bytesA primeira etapa é dividir ambos
x
ey
em um XOR de potências de2
, tomar seus produtos nim em pares e depois XOR os resultados (porque o produto nim é distribuído pelo XOR). Uma vez que tenhamos recursed ao caso dex
ey
ambas as potências de 2, nota-se que os poderes Fermat multiplicam uns com os outros usando a aritmética ordinária, para que possamos, portanto, factorisex
ey
em poderes Fermat. Sex
ey
não compartilharmos um poder Fermat, podemos reverter o processo e simplesmente retornarx * y
. No entanto, se eles compartilham um poder Fermat, então dividimos ambosx
ey
por esse poder, calculamos o produto nim e, em seguida, levamos o produto nim com o quadrado nim desse poder Fermat. Ungolfed:fonte
Wolfram Language (Mathematica) , 81 bytes
Experimente online!
Usando a fórmula:
fonte