Muros binarios debilitados

21

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 0s ( .s) están presentes en los puntos que dejó la 1s 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 , por lo que gana la respuesta más corta en bytes.

Hiperneutrino
fuente
Sandbox Post
HyperNeutrino
1
¿Más casos de prueba? Sabes, los casos de prueba no cuadrados serían buenos.
Leaky Nun
@LeakyNun Claro. Yo haré eso.
HyperNeutrino
Eso es solo un problema de clasificación para matrices de bits.
Marcus Müller
@ MarcusMüller Tienes razón: me di cuenta de eso después de la respuesta
MATL

Respuestas:

29

MATL , 4 bytes

BSXB

Pruébalo en MATL Online

Explicación

    % Implicitly grab input as an array 
    %   STACK: [10, 17, 19, 23]
B   % Convert each element to binary where each decimal number results in a row
    %   STACK: [0 1 0 1 0;
    %           1 0 0 0 1;
    %           1 0 0 1 1;
    %           1 0 1 1 1]
S   % Sort each column, placing all of the 1's at the bottom of each column
    %   STACK: [0 0 0 0 0;
    %           1 0 0 1 1;
    %           1 0 0 1 1;
    %           1 1 1 1 1] 
XB  % Convert each row from its binary representation to its decimal number
    %   STACK: [0, 19, 19, 31]
    % Implicitly display the result
Suever
fuente
o_O Cómo funciona esto: o
HyperNeutrino
1
¿MATL acaba de superar a Jelly por 4 bytes ? o_O
totalmente humano
5 bytes ahora :-p
Leaky Nun
Nunca pensé que habría una función integrada para mover las de abajo xD +1
HyperNeutrino
1
@totallyhuman bueno, espera a que llegue Dennis
JungHwan Min
5

JavaScript (ES6), 50 bytes

f=a=>a.map(_=>a.map((e,i)=>a[a[i]|=a[--i],i]&=e))&&a

Explicación: Supongamos que dos filas de la pared fueran así:

0011
0101

El resultado debe ser este:

0001
0111

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.

Neil
fuente
2

Japt , 16 bytes

m¤z3 ®¬n qÃz mn2

Pruébalo en línea! usando la -Qbandera para formatear el resultado de la matriz.

Explicación

m¤z3 ®¬n qÃz mn2    Implicit: U = input array.
                        [10, 17, 19, 23]
m¤z3                Map U to binary strings and rotate the array left 90°
                         1010       0111
                        10001   ->  1011
                        10011       0001
                        10111       1000
                                     111
®¬n qà              Sort each binary string, putting 0s and spaces at the start
                        0111
                        0111
                        0001
                        0001
                         111
z mn2               Rotate right 90° and convert each back to a number
                         0000       0
                        10011   ->  19
                        10011       19
                        11111       31
                    Implicit output of resulting array
Justin Mariner
fuente
Yo creo que se puede ahorrar un byte conmì2 z3 mn z mì2
ETHproductions
@ETHproductions Parece que gira la matriz 2D, en lugar de girar la matriz de cadenas, rellena cada matriz interna en nulllugar de espacios. Entonces eso no parece funcionar. Y nullse ordena a la derecha de la 1s, a diferencia de los espacios, que se ordenan a la izquierda.
Justin Mariner
2

Mathematica, 64 bytes

#~FromDigits~2&/@(Sort/@(PadLeft[#~IntegerDigits~2&/@#]))&

 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 .

DanTheMan
fuente
2

Octava, 29 25 bytes

4 bytes guardados gracias a @Stewie

@(x)bi2de(sort(de2bi(x)))
Suever
fuente
de2bi/bi2deahorra 4 bytes en octava. Funciona en octave-online.net.
Stewie Griffin
@StewieGriffin ¡Gracias!
Suever
1

J , 13 bytes

/:~"1&.|:&.#:

Pruébalo en línea!

Explicación

/:~"1&.|:&.#:  Input: array M
           #:  Convert each in M to binary with left-padding
       |:&     Transpose
/:~"1&         Sort each row
     &.|:      Inverse of transpose (which is just transpose)
         &.#:  Inverse of converting to binary
millas
fuente
Ahí está ese relleno binario izquierdo nuevamente, +1. Y también, ¿puede explicar por qué necesitaría usar el inverso de la transposición, ya que es solo transposición?
Zacharý
@ Zacharý Las inversas se utilizan para deshacer las operaciones utilizadas antes de ordenar cada fila. Es cierto que la inversa de la transposición es solo transposición, pero otra forma de ver esto es como <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.
millas
1

05AB1E , 9 bytes

bí0ζR€{øC

Pruébalo en línea!

Algoritmo algo diferente del de Magic.

Erik el Outgolfer
fuente
ζ, maldición. Borrado el mío, toma mi +1.
Urna de pulpo mágico
@MagicOctopusUrn ¿Por qué eliminaste el tuyo? No hay necesidad de.
Erik the Outgolfer
No es realmente muy diferente (en términos de algoritmo) y esto fue un 25% mejor.
Urna mágica del pulpo
1

Dyalog APL, 24 21 19 bytes

2⊥↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⎕

Prué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 nuevamente
  • 2⊥ convertir de binario (dado que lo transpone, llegamos al resultado correcto)
Zacharý
fuente
1

Dyalog APL (23 caracteres)

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}
  1. Convierta los argumentos de entrada en una matriz binaria
  2. Dividir la matriz en columnas.
  3. Ordenar las columnas en orden ascendente
  4. Convierta las filas ordenadas nuevamente a decimales

Ejemplo

  {2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}10 17 19 23
      0 19 19 31

Gracias a Zacharý por corregirme en este caso.

James Heslip
fuente
Se puede reemplazar con (⊥⍣¯1)⍵con ⊥⍣¯1⊢⍵. Además, no creo que necesite la especificación del eje en split ( ↓[1]=> ).
Zacharý
¡Ah, y se supone que debes volver a convertirlo en una lista!
Zacharý
Esto no es valido.
Zacharý
Gracias, Zacharý, estuve trabajando en esto anoche y creo que leí mal el problema. He modificado mi solución ahora.
James Heslip
1
Bueno, buen trabajo! ( ⊥⍣¯1Realmente necesita ser un incorporado). Y gracias por tener mi nombre de usuario correcto.
Zacharý
0

JavaScript, 127125 bytes

a=>a[m='map'](_=>b[m]((n,i)=>n&&(b[i]--,d|=1<<i),d=0)&&d,b=[...Array(32)][m]((_,c)=>a[m](e=>d+=!!(2**c&e),d=0)&&d)).reverse()

Pruébalo en línea

-2 bytes gracias a Cows quack


fuente
(1<<c)&epuede convertirse2**c&e
Kritixi Lithos
0

Python 2, 142 bytes

... y aún jugando al golf ... con suerte –– ¡Se agradece cualquier ayuda!

def c(l):b=[bin(n)[2:]for n in l];print[int(n,2)for n in map(''.join,zip(*map(sorted,zip(*['0'*(len(max(b,key=len))-len(x))+x for x in b]))))]

Una gran parte de esto es para rellenar los números con ceros.

Más legible:

def collapse(nums):
    bins = [bin(n)[2:] for n in nums]
    bins = [('0'*(len(max(bins, key = len)) - len(x))) + x for x in bins]
    print [int(n, 2) for n in map(''.join, zip(*map(sorted, zip(*bins))))]

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.

Daniel
fuente
142 bytes , tienes algunos paréntesis redundantes.
Sr. Xcoder
@ Mr.Xcoder, oh sí, eso fue una tontería
Daniel