quintopia ha publicado aquí un desafío para calcular coeficientes multinomiales (parte del texto aquí se copia desde allí). Hay un algoritmo divertido para calcular coeficientes multinomiales mod 2.
Dada una lista de números, k 1 , k 2 , ..., k m , genera el residuo del coeficiente multinomial:
mod 2. reducido El siguiente algoritmo hace esto de manera eficiente: para cada k i , calcule la expansión binaria de k i , es decir, encuentre un ij tal que cada a ij sea 1 o 0 y
Si hay alguna j tal que a rj = a sj = 1 para r ≠ s, entonces el coeficiente multinomial mod 2 asociado es 0, de lo contrario el coeficiente multinomial mod 2 es 1.
Tarea
Escriba un programa o función que tome m números, k 1 , k 2 , ..., k m , y genere o devuelva el coeficiente multinomial correspondiente. Opcionalmente, su programa puede tomar m como argumento adicional si es necesario.
Estos números pueden ingresarse en cualquier formato que le guste, por ejemplo, agrupados en listas o codificados en unario, o cualquier otra cosa, siempre que su código realice el cálculo real del coeficiente multinomial, y no el proceso de codificación.
La salida puede ser cualquier valor verdadero si el coeficiente multinomial es impar y cualquier valor falsey si el coeficiente multinomial es par.
No están permitidos los elementos integrados diseñados para calcular el coeficiente multinomial.
Se aplican lagunas estándar.
Puntuación
Este es el código de golf: la solución más corta en bytes gana.
Ejemplos:
Para encontrar el coeficiente multinomial de 7, 16 y 1000, expandimos binariamente cada uno de ellos:
Como ninguna columna tiene más de un 1, el coeficiente multinomial es impar y, por lo tanto, deberíamos generar algo verdadero.
Para encontrar el coeficiente multinomial de 7, 16 y 76, expandimos binariamente cada uno de ellos:
Dado que 76 y 7 tienen un 4 en su expansión binaria, el coeficiente multinomial es par y, por lo tanto, arrojamos un valor de falsey.
Casos de prueba:
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
fuente
==
para la igualdad podrían haber salvado un byte si se permitiera cambiar la verdad y la falsey.Respuestas:
Jalea , 4 bytes
Pruébalo en línea!
Pruebe si la suma es igual a bit-or-sum (ie
a+b+c == a|b|c
).fuente
Python
32,554342 bytes-12 bytes del Sr. Xcoder
-1 byte de Rod
Pruébalo en línea!
Explicación: Comprueba si la suma de los números es igual a los bits o a los números.
fuente
lambda l:sum(l)==eval("|".join(map(str,l)))
Python 2 , 37 bytes
Pruébalo en línea!
Otro puerto del algoritmo de pizzapants184 ...
fuente
Limpio , 38 bytes
Pruébalo en línea!
Otro puerto más.
fuente
Japt, 6 bytes
Otro puerto de soluciones de pizzapants184 y Leaky Nun.
Pruébalo
fuente
JavaScript (ES6),
373534 bytesGuardado 2 bytes gracias a @ Mr.Xcoder
Guardado 1 byte gracias a @ETHproductions
Comparar la suma con el OR bit a bit (como lo hicieron pizzapants184 y Leaky Nun ) es
134 bytes más corto que mi enfoque inicial:Casos de prueba
Mostrar fragmento de código
Alt. versión, 38 bytes
Casos de prueba
Mostrar fragmento de código
fuente
a=>(q=c=>eval(a.join(c)))`|`==q`+`;
Haskell , 38 bytes
(==).sum<*>foldl1 xor
es una función anónima que devuelve aBool
. Usar como((==).sum<*>foldl1 xor) [2,0,1]
.Pruébalo en línea!
Prácticamente el mismo truco de pizzapants184 y Leaky Nun que todo el mundo usa, excepto que con los nombres de los operadores Haskell ahorra un byte para usar (bit a bit) en
xor
lugar de(.|.)
(bit a bit o).(==).sum<*>foldl1 xor
es una versión sin puntos de\l->sum l==foldl1 xor l
.fuente
Java 8, 53 bytes
Puerto de la respuesta Jelly de @LeakyNun .
Explicación:
Pruébalo aquí.
fuente
Pyth , 6 bytes
Banco de pruebas.
fuente
Casco , 5 bytes
Pruébalo en línea!
fuente
Perl 6 , 15 bytes
Pruébalo
Expandido:
fuente
rojo , 78 bytes
Cómo funciona:
Sin golf:
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 15 bytes
Pruébalo en línea!
fuente
Lote, 73 bytes
Salidas
1
para la verdad, nada para la falsedad. Otro puerto obvio de pizzapants184 / algoritmo de Leaky Nun.fuente
J , 10 bytes
Otro puerto más de soluciones para pizzapants184 y Leaky Nun.
¿Cómo funciona?
+/.&.#:
- Convierta los números a binario, aplique bit a bit o a las potencias de dos y vuelva a convertir de binario a decimal+/
- reducir la entrada por adición=
- ¿son iguales los anteriores?Pruébalo en línea!
Alternativa directa
J , 12 bytes
¿Cómo funciona?
+/@#:
- convierte cada número a binario y encuentra la suma de cada potencia de 2>./
- encuentra el máximo2>
- ¿es menos de 2? -> verdadPruébalo en línea!
fuente
Triangularidad , 31 bytes.
Pruébalo en línea!
Solución alternativa, 31 bytes.
Pruébalo en línea!
fuente