Inspirado por Criar uma parede binária
Dada uma lista de números inteiros positivos, podemos escrevê-los todos acima um do outro, assim, por [2, 6, 9, 4]
exemplo:
0010
0110
1001
0100
Podemos imaginar isso como uma parede:
..#.
.##.
#..#
.#..
No entanto, este é um muro muito fraco e entrou em colapso! Cada 1
( #
) cai até atingir o "solo" ou outro 1
( #
). Os 0
s .
estão presentes nos pontos deixados pelos 1
s movidos .
Isso se torna o seguinte:
....
....
.##.
####
O que se traduz novamente em:
0000
0000
0110
1111
Qual, como uma lista de números, é [0, 0, 6, 15]
.
Outro caso de teste
[10, 17, 19, 23]
Isso se torna:
01010
10001
10011
10111
que se torna:
00000
10011
10011
11111
traduzindo de volta para:
[0, 19, 19, 31]
Desafio
Dada uma lista de números inteiros positivos, aplique essa transformação à lista. Entrada / Saída como listas de números inteiros positivos em qualquer formato razoável. Aplicam-se brechas padrão.
Este é um código-golfe , então a resposta mais curta em bytes vence!
fonte
Respostas:
MATL , 4 bytes
Experimente no MATL Online
Explicação
fonte
Python , 68 bytes
Experimente online!
fonte
JavaScript (ES6), 50 bytes
Explicação: Suponha que duas linhas da parede sejam assim:
O resultado precisa ser este:
Em outras palavras, a primeira linha se torna o AND das duas linhas e a segunda linha se torna o OU das duas linhas. Isso só precisa ser repetido vezes suficientes para que todos os bits caiam no fundo.
fonte
Geléia , 9 bytes
Experimente online!
fonte
Japonês , 16 bytes
Experimente online! usando o
-Q
sinalizador para formatar o resultado da matriz.Explicação
fonte
mì2 z3 mn z mì2
null
vez de espaços. Então, isso não parece funcionar. Enull
é classificado à direita dos1
s, diferentemente dos espaços, que são classificados à esquerda.Mathematica, 64 bytes
é
\[Transpose]
Isso converte a entrada (uma lista de números) em uma lista de listas de dígitos, forma uma matriz quadrada, transpõe, classifica as linhas para que o 1 "caia" no fundo, transponha de volta e depois converta novamente em números .
fonte
Python 3.5 , 60 bytes
Experimente online!
Toma entrada como
f(2, 6, 9, 4)
. Assume que a entrada não está vazia. Usa muita descompactação de tupla .fonte
Oitava,
2925 bytes4 bytes salvos graças a @Stewie
fonte
de2bi/bi2de
salva 4 bytes na oitava. Funciona em octave-online.net.J , 13 bytes
Experimente online!
Explicação
fonte
<convert from binary> <transpose> <sort each row> <transpose> <convert to binary> M
, onde as duas primeiras funções são apenas as inversas das duas últimas.05AB1E , 9 bytes
Experimente online!
Algoritmo meio diferente do Magic.
fonte
ζ
, droga. Meu excluído, pegue meu +1.Dyalog APL,
242119 bytesExperimente online! (modificado para que o TryAPL aceite como válido)
Quão?
⎕
entrada avaliada (matrizes são separadas por espaço)2⊥⍣¯1⊢
converte cada um dos argumentos em binário (transposto do que está em questão)↓
transforma uma matriz 2D em um vetor de vetores{⍵[⍋⍵]}¨
classifica cada um dos elementos do vetor↑
transforma o vetor de vetores em uma matriz 2D novamente2⊥
converter de binário (uma vez que o transpõe, chegamos ao resultado correto)fonte
Dyalog APL (23 caracteres)
Exemplo
Obrigado a Zacharý por me corrigir neste.
fonte
(⊥⍣¯1)⍵
por⊥⍣¯1⊢⍵
. Além disso, acho que você não precisa da especificação do eixo na divisão (↓[1]
=>↓
).⊥⍣¯1
realmente precisa ser um builtin). E obrigado por realmente ter acertado meu nome de usuário.JavaScript,
127125 bytesExperimente online
-2 bytes graças ao vacas charlatão
fonte
(1<<c)&e
pode se tornar2**c&e
Python 2, 142 bytes
... e ainda jogando golfe ... espero - Qualquer ajuda apreciada!
Uma grande parte disso é para preencher os números com zeros.
Mais legível:
Isso cria uma matriz de representações de cadeias binárias, a preenche, gira 90º no sentido horário, classifica cada linha, gira 90º para trás e cria números inteiros a partir de cada linha.
fonte