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
fonte
==
igualdade poderiam ter economizado um byte se truthy e falsey pudessem ser invertidos.Respostas:
Gelatina , 4 bytes
Experimente online!
Teste se a soma é igual à bit a bit ou soma (ou seja
a+b+c == a|b|c
).fonte
Python
32,554342 bytes-12 bytes do Sr. Xcoder
-1 byte de Rod
Experimente online!
Explicação: Verifica se a soma dos números é igual ao bit a bit - ou dos números.
fonte
lambda l:sum(l)==eval("|".join(map(str,l)))
Python 2 , 37 bytes
Experimente online!
Outra porta do algoritmo de pizzapants184 ...
fonte
Limpo , 38 bytes
Experimente online!
Mais um porto.
fonte
Japonês, 6 bytes
Outro porto de soluções pizzapants184 e Leaky Nun.
Teste-o
fonte
JavaScript (ES6),
373534 bytesEconomizou 2 bytes graças a @ Mr.Xcoder
Economizou 1 byte graças a @ETHproductions
A comparação da soma com o OR bit a bit (como pizzapants184 e Leaky Nun fizeram) é
134 bytes menor que minha abordagem inicial:Casos de teste
Mostrar snippet de código
Alt. versão, 38 bytes
Casos de teste
Mostrar snippet de código
fonte
a=>(q=c=>eval(a.join(c)))`|`==q`+`;
Haskell , 38 bytes
(==).sum<*>foldl1 xor
é uma função anônima retornando aBool
. Use como((==).sum<*>foldl1 xor) [2,0,1]
.Experimente online!
Praticamente o mesmo truque de pizzapants184 e Leaky Nun que todo mundo usa, exceto que, com o nome do operador Haskell, ele economiza um byte para usar (bit a bit) em
xor
vez de(.|.)
(bit a bit ou).(==).sum<*>foldl1 xor
é uma versão sem pontos do\l->sum l==foldl1 xor l
.fonte
Java 8, 53 bytes
Porto da resposta da @LeakyNun 's Jelly .
Explicação:
Experimente aqui.
fonte
Pitão , 6 bytes
Suíte de teste.
fonte
Casca , 5 bytes
Experimente online!
fonte
Perl 6 , 15 bytes
Teste-o
Expandido:
fonte
Vermelho , 78 bytes
Como funciona:
Ungolfed:
Experimente online!
fonte
Wolfram Language (Mathematica) , 15 bytes
Experimente online!
fonte
Lote, 73 bytes
Saídas
1
para verdade, nada para falsidade. Outro exemplo óbvio do algoritmo de pizzapants184 / Leaky Nun.fonte
J , 10 bytes
Mais um porto de soluções pizzapants184 e Leaky Nun.
Como funciona?
+/.&.#:
- converta os números em binário, aplique bit a bit ou na potência de dois e converta novamente de binário em decimal+/
- reduza a entrada adicionando=
- os acima são iguais?Experimente online!
Alternativa direta
J , 12 bytes
Como funciona?
+/@#:
- converta cada número em binário e encontre a soma de cada potência de 2>./
- encontre o máximo2>
- é inferior a 2? -> verdadeExperimente online!
fonte
Triangularidade , 31 bytes
Experimente online!
Solução alternativa, 31 bytes
Experimente online!
fonte