Reto
Dada una lista de enteros positivos, encuentre si existe una permutación donde tomar hasta un bit de cada uno de los enteros, 1
se puede crear un número binario que consista en todos los s.
El número de bits en el número binario resultante es igual al MSB más alto en la lista de enteros.
Salida
Su código debe generar o devolver un valor verdadero / falso que indique si existe tal permutación.
Ejemplos
Verdad:
Con la lista [4, 5, 2]
y su representación binaria [100, 101, 10]
, podemos usar los bits tercero, primero y segundo, respectivamente, para crear 111
:
4 -> 100 -> 100 -> 1
5 -> 101 -> 101 -> 1
2 -> 010 -> 010 -> 1
Result 111
Con la lista [3, 3, 3]
, todos los números tienen los primeros y segundos bits configurados como 1
, por lo que podemos elegir con un número de sobra:
3 -> 11 -> 11 -> 1
3 -> 11 -> 11 -> 1
3 -> 11 -> 11 ->
Result 11
Falsey
Con la lista [4, 6, 2]
, ninguno de los números tiene el primer bit establecido como 1
, por lo que no se puede crear el número binario:
4 -> 100
6 -> 110
2 -> 010
Con la lista [1, 7, 1]
, solo uno de los números tiene el segundo y tercer bit establecido como 1
, y el número no se puede crear:
1 -> 001
7 -> 111
1 -> 001
Obviamente, si el número máximo de bits establecidos excede el número de enteros, el número de resultado nunca se puede crear.
Casos de prueba
Verdad:
[1]
[1, 2]
[3, 3]
[3, 3, 3]
[4, 5, 2]
[1, 1, 1, 1]
[15, 15, 15, 15]
[52, 114, 61, 19, 73, 54, 83, 29]
[231, 92, 39, 210, 187, 101, 78, 39]
Falsey
[2]
[2, 2]
[4, 6, 2]
[1, 7, 1]
[15, 15, 15]
[1, 15, 3, 1]
[13, 83, 86, 29, 8, 87, 26, 21]
[154, 19, 141, 28, 27, 6, 18, 137]
Reglas
Las lagunas estándar están prohibidas. Como se trata de código de golf , ¡la entrada más corta gana!
Respuestas:
Jalea , 11 bytes
Pruébalo en línea!
Cómo funciona
fuente
J , 30 bytes
Todo el crédito va para mi colega Marshall .
Función de prefijo tácito sin nombre.
Pruébalo en línea!
(
@
es la composición de la función)#:
antibase-2|:
transponer(
...)^:2
aplique la siguiente función dos veces:1-
Negativo booleano>./
el maximo@
del$
longitudes de eje{.
tomar (relleno con ceros) de|:
el argumento transpuesto+./ .*
"magia determinante loca" *[:
no enganchar (no-op - sirve para componer la parte anterior con el resto)* En palabras de Marshall.
fuente
JavaScript (ES6),
104...9383 bytesDevoluciones
0
o1
.Casos de prueba
Mostrar fragmento de código
Método
Dada la matriz de entrada A = [a 0 , a 1 , ..., a N-1 ] , buscamos una permutación [a p [0] , a p [1] , ..., a p [N- 1] ] de A y un número entero x ≤ N tal que:
Formateado y comentado
fuente
Casco , 14 bytes
Pruébalo en línea!
Explicación
fuente
05AB1E ,
232220 bytes-1 byte gracias a Mr.Xcoder
Verdadero: 1, Falso: 0
Pruébalo en línea!
Explicaciones:
fuente
Wolfram Language (Mathematica) , 65 bytes
Pruébalo en línea!
Explicación
Comenzamos por convertir todas las entradas a listas binarias.
Luego rellenamos todas esas listas con ceros a la izquierda para hacer que la matriz sea rectangular. El resultado se almacena
n
para más tarde.Yay, fuerza bruta, obtengamos todas las permutaciones posibles de la entrada.
Esto obtiene el rastro para cada permutación, es decir, la suma de los elementos diagonales en la permutación. En otras palabras, sumamos el MSB del primer número, el siguiente al MSB del segundo número y así sucesivamente. Si la permutación es válido, todo esto habrá 1 y habrá tantas 1 s como el número de entrada más grande es amplia.
Obtenemos la traza máxima, porque la traza nunca puede ser más que la de una permutación válida.
El lado derecho es solo una versión de golf
Length @ First @ n
, es decir, obtiene el ancho de la matriz rectangular y, por lo tanto, el ancho del número de entrada más grande. Queremos asegurarnos de que el rastro de alguna permutación sea igual a esto.fuente
PHP,
255243160 bytes-12 bytes, sacó la clasificación
-83 bytes (!) Gracias a Titus
Pruébalo en línea!
Imprime 1 para la verdad, nada para falsey.
Versión original sin golf:
fuente
function f($a,$v=NULL,$b=[]){($v=$v??(1<<log(max($a),2)+1)-1)||die("1");if($p=array_pop($a))while($p-=$i)($b[$i=1<<log($p,2)]|$v<$i)||f($a,$v-$i,[$i=>1]+$b);}
true
:die("1")
→die(!0)
.Lua 5.2, 85 bytes
Esto establece que x es una función que acepta un número variable de entradas (se espera que sean enteros de 32 bits), y se imprime en stdout "verdadero" o "falso".
Uso:
fuente
[1,15,3,1]
parece volver entrue
lugar de,false
por ejemplo. Aquí está su código, el compilador en línea de TIO. Los otros dos casos de prueba que fallan son[1,7,1]
y[15,15,15]
. Todos los demás casos de prueba arrojan los resultados correctos.PHP, 121 bytes
Pruébalo en línea .
Descompostura
fuente
J , 49 bytes
¿Necesito contar también la 'g =.'? Estoy listo para agregarlo.
Un largo verbo explícito esta vez. Probé uno tácito para el mismo algoritmo, pero resultó ser aún más largo y más feo que esto. Lejos de la solución de Adám.
Explicación: (y es el argumento correcto de la función)
Pruébalo en línea!
fuente
Python 3 ,
126120 bytesGuardado 6 bytes debido al Sr. Xcoder
Pruébalo en línea!
fuente
[0]+[...]
No tiene sentido, ¿no?any(g(x[:i]+x[i+1:],n-1)for i in range(len(x))if x[i]&2**n)
Debería ser suficiente.Jalea , 17 bytes
Un enlace monádico que toma una lista de números y regresa
1
(verdad) o0
(falsey).Pruébalo en línea!
Esto expirará en TIO por el mayor tiempo de cada caso de prueba.
¿Cómo?
fuente
R ,
247 bytes221 bytesPruébalo en línea!
Versión sin golf
Me di cuenta de que la verificación sin filas era innecesaria con los
drop=F
argumentos. También se eliminó un poco de espacio en blanco molesto.fuente
PHP, 152 bytes
No imprime nada para falso, 1 para verdadero.
Sin golf:
fuente
Jalea , 17 bytes
Banco de pruebas.
fuente
C, 79 bytes
fuente
try it online
enlace sería útil.[1, 7, 1]
debería devolver falso, y[52, 114, 61, 19, 73, 54, 83, 29]
debería devolver verdadero