Inspirado en Crear un muro binario
Dada una lista de enteros positivos, podemos escribirlos uno encima del otro, por [2, 6, 9, 4]
ejemplo:
0010
0110
1001
0100
Podemos imaginar esto como un muro:
..#.
.##.
#..#
.#..
Sin embargo, esta es una pared muy débil, ¡y se ha derrumbado! Cada 1
( #
) cae hasta que toca el "suelo" u otro 1
( #
). Las 0
s ( .
s) están presentes en los puntos que dejó la 1
s movida .
Esto se convierte en lo siguiente:
....
....
.##.
####
Lo que se traduce de nuevo a:
0000
0000
0110
1111
Que, como una lista de números, es [0, 0, 6, 15]
.
Otro caso de prueba
[10, 17, 19, 23]
Esto se convierte en:
01010
10001
10011
10111
que se convierte en:
00000
10011
10011
11111
traduciendo de nuevo a:
[0, 19, 19, 31]
Reto
Dada una lista de enteros positivos, aplique esta transformación a la lista. Entrada / Salida como listas de enteros positivos en cualquier formato razonable. Se aplican lagunas estándar.
Este es un código de golf , por lo que gana la respuesta más corta en bytes.
fuente
Respuestas:
MATL , 4 bytes
Pruébalo en MATL Online
Explicación
fuente
Python , 68 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 50 bytes
Explicación: Supongamos que dos filas de la pared fueran así:
El resultado debe ser este:
En otras palabras, la primera fila se convierte en el AND de las dos filas y la segunda fila se convierte en el OR de las dos filas. Esto solo necesita repetirse suficientes veces para que todos los bits caigan al fondo.
fuente
Jalea , 9 bytes
Pruébalo en línea!
fuente
Japt , 16 bytes
Pruébalo en línea! usando la
-Q
bandera para formatear el resultado de la matriz.Explicación
fuente
mì2 z3 mn z mì2
null
lugar de espacios. Entonces eso no parece funcionar. Ynull
se ordena a la derecha de la1
s, a diferencia de los espacios, que se ordenan a la izquierda.Mathematica, 64 bytes
es
\[Transpose]
Esto convierte la entrada (una lista de números) en una lista de listas de dígitos, la convierte en una matriz cuadrada, la transpone, ordena las filas para que el 1 "caiga" al fondo, se transpone de nuevo, luego se convierte de nuevo en números .
fuente
Python 3.5 , 60 bytes
Pruébalo en línea!
Toma entrada como
f(2, 6, 9, 4)
. Asume que la entrada no está vacía. Utiliza muchas tuplas para desempacar .fuente
Octava,
2925 bytes4 bytes guardados gracias a @Stewie
fuente
de2bi/bi2de
ahorra 4 bytes en octava. Funciona en octave-online.net.J , 13 bytes
Pruébalo en línea!
Explicación
fuente
<convert from binary> <transpose> <sort each row> <transpose> <convert to binary> M
, donde las dos primeras funciones son solo las inversas de las dos últimas.05AB1E , 9 bytes
Pruébalo en línea!
Algoritmo algo diferente del de Magic.
fuente
ζ
, maldición. Borrado el mío, toma mi +1.Dyalog APL,
242119 bytesPruébalo en línea! (modificado para que TryAPL lo acepte como válido)
¿Cómo?
⎕
entrada evaluada (las matrices están separadas por espacios)2⊥⍣¯1⊢
convierte cada uno de los argumentos a binario (transpuesto de lo que está en la pregunta)↓
convierte una matriz 2D en un vector de vectores{⍵[⍋⍵]}¨
ordena cada uno de los elementos del vector↑
convierte el vector de vectores en una matriz 2D nuevamente2⊥
convertir de binario (dado que lo transpone, llegamos al resultado correcto)fuente
Dyalog APL (23 caracteres)
Ejemplo
Gracias a Zacharý por corregirme en este caso.
fuente
(⊥⍣¯1)⍵
con⊥⍣¯1⊢⍵
. Además, no creo que necesite la especificación del eje en split (↓[1]
=>↓
).⊥⍣¯1
Realmente necesita ser un incorporado). Y gracias por tener mi nombre de usuario correcto.JavaScript,
127125bytesPruébalo en línea
-2 bytes gracias a Cows quack
fuente
(1<<c)&e
puede convertirse2**c&e
Python 2, 142 bytes
... y aún jugando al golf ... con suerte –– ¡Se agradece cualquier ayuda!
Una gran parte de esto es para rellenar los números con ceros.
Más legible:
Esto crea una matriz de representaciones de cadenas binarias, las rellena, gira 90º en el sentido de las agujas del reloj, ordena cada fila, la gira 90º hacia atrás y luego crea números enteros fuera de cada fila.
fuente