A quintopia postou aqui um desafio para calcular coeficientes multinomiais (parte do texto aqui é copiado de lá). Existe um algoritmo divertido para calcular coeficientes multinomiais mod 2.
Dada uma lista de números, k 1 , k 2 , ..., k m , gera o resíduo do coeficiente multinomial:
mod reduzida 2. O seguinte algoritmo faz isso de forma eficiente: para cada k i , calcular a expansão binária de k i , isto é, encontrar um ij tal que cada um ij é 1 ou 0 e
Se não houver qualquer j de tal modo que um RJ = a sj = 1 para R ≠ s, em seguida, a associada modificação 2 coeficiente multinominal é 0, caso contrário, a modificação 2 é um coeficiente multinominal.
Tarefa
Escreva um programa ou função que pegue m números, k 1 , k 2 , ..., k m e emita ou retorne o coeficiente multinomial correspondente. Seu programa pode opcionalmente considerar m como argumento adicional, se necessário.
Esses números podem ser inseridos em qualquer formato que você queira, por exemplo, agrupado em listas ou codificado em unário ou qualquer outra coisa, desde que a computação real do coeficiente multinomial seja realizada pelo seu código, e não pelo processo de codificação.
A saída pode ser qualquer valor verdadeiro se o coeficiente multinomial for ímpar e qualquer valor falsey se o coeficiente multinomial for par.
Built-ins projetados para calcular o coeficiente multinomial não são permitidos.
Aplicam-se brechas padrão.
Pontuação
Este é o código golf: A solução mais curta em bytes vence.
Exemplos:
Para encontrar o coeficiente multinomial de 7, 16 e 1000, expandimos binariamente cada um deles:
Como nenhuma coluna possui mais de um 1, o coeficiente multinomial é ímpar e, portanto, devemos produzir algo de verdade.
Para encontrar o coeficiente multinomial de 7, 16 e 76, expandimos binariamente cada um deles:
Como 76 e 7 têm 4 em sua expansão binária, o coeficiente multinomial é uniforme e, portanto, produzimos um valor de falsey.
Casos de teste:
Input: [2, 0, 1]
Output: Truthy
Input: [5,4,3,2,1]
Output: Falsey
Input: [1,2,4,8,16]
Output: Truthy
Input: [7,16,76]
Output: Falsey
Input: [7,16,1000]
Output: Truthy
Input: [545, 1044, 266, 2240]
Output: Truthy
Input: [1282, 2068, 137, 584]
Output: Falsey
Input: [274728976, 546308480, 67272744, 135004166, 16790592, 33636865]
Output: Truthy
Input: [134285315, 33849872, 553780288, 544928, 4202764, 345243648]
Output: Falsey
==
igualdade poderiam ter economizado um byte se truthy e falsey pudessem ser invertidos.