Desafio
Dada uma grade retangular de caracteres ascii imprimíveis como uma sequência ou através de entrada padrão, escreva uma função ou programa que colecione os caracteres não espaciais em uma pilha na parte inferior.
As regras:
- A saída possui as mesmas dimensões e caracteres da entrada.
- Um caractere não espacial em
(row a,column b)
não pode ter um caractere de espaço' '
em(a-1, b)
,(a-1,b-1)
ou(a-1,b+1)
, onde as linhas são numeradas da parte inferior. Isso tem a conseqüência de que todas as pilhas verticais devem entrar em colapso lateralmente. - Um caractere não espacial pode viajar na maioria dos
(initial height - final height)
lugares para a esquerda ou direita (veja a Fig. 1). - Você pode assumir que a imagem possui espaço suficiente para recolher sem que caracteres caiam da tela.
Figura 1: possíveis locais finais para os caracteres @#$
mostrados como x,y,z
, respectivamente.
..............
...@..........
..xxx.........
.xxxxx...#....
xxxxxxx.yyy.$.
A ordem na qual os caracteres são recolhidos pode ser escolhida livremente. Os espaços à direita não são bons, mas as novas linhas à direita são.
Isso é código-golfe , então a resposta mais curta em bytes vence!
Exemplo
(__)
(oo)
/------\/
/ | ||
* /\---/\
~~ ~~
..."Have you mooed today?"...
Uma saída possível:
--(_
/----|/|(o_)
/|/~\---~\\/o)
..."Have*you~mooed~today?"...
Respostas:
JavaScript (ES6),
1009088 bytesRequer que a cadeia tenha pelo menos duas linhas e todas as linhas sejam preenchidas com o mesmo comprimento. Saída para a imagem de exemplo:
Observe que, ao tentar mover elementos para a direita, se possível, o
*
não caiu entre oHave
e oyou
.Editar: economizou 10% graças a @ETHproductions. Economizou mais 2 bytes graças a @DanielIndie.
Retina 0.8.2 , 50 bytes
Experimente online! Uma abordagem ligeiramente diferente da minha resposta JavaScript, isso usa um grupo de equilíbrio para corresponder a um espaço abaixo do caractere não espacial; o
(?<-1>)?
permite que o espaço para ser uma coluna para a esquerda, enquanto o.?
permite que o espaço para ser uma coluna para a direita.Retina , 40 bytes
Experimente online! Porta da minha resposta JavaScript. O
0L$
estágio atômico pega a entrada e substitui os dois comprimentos na segunda linha, resultando no comando que realmente executa a substituição, que é então avaliada na entrada original pelo~
estágio composto.fonte
\n
com uma nova linha literal para obtê-lo para baixo a dois dígitos ;-)l=s.search`\n`
economizar alguns bytes.f=
é necessário para a recursão, mas ainda me salva 2 bytes, obrigado!Python 2, 298 bytes
Recebe entrada como uma lista de strings (uma por linha)
Exemplo: Entrada:
Resultado:
fonte
C, 252 bytes
Código de teste ungolfed:
Resultado do teste:
fonte
Algodoo (não concorrente)
Exemplo de entrada - degenerado usado.
Runnning - gravidade padrão e salto.
A precisão da saída pode ser ajustada através das configurações de Fricção e Densidade nos objetos.
Algodoo é lógico programável .
fonte
JavaScript, 286 bytes
Exemplos
Resultado:
Outro exemplo:
Resultado:
Função ungolfed
fonte
c>" "
em branco é ondec
representa o personagem que você está testando.