Desafio
Você recebe uma representação de caracteres ASCII-art em um plano como entrada por qualquer método razoável. Isso conterá apenas:
[a-z]
representando caracteres móveis. Cada letra aparecerá no quadro no máximo uma vez.#
representando paredes imóveis.
representando espaço vazio
Por exemplo:
abcdef.gh#..
.......ij.#.
#..#.......#
...#.#...###
.#.......#q#
.........###
Você também recebe uma string representando as mudanças na gravidade. Isso conterá apenas:
>
representando uma mudança na gravidade para a direita<
representando uma mudança na gravidade para a esquerda^
representando uma mudança na gravidade ascendentev
representando uma mudança na gravidade descendente
Por exemplo:
v>^
Seu programa deve simular cada alteração na gravidade sequencialmente até que todos os personagens parem de se mover (eles atingem uma parede ou outro personagem). Os caracteres que "caem da borda do mapa" são removidos permanentemente e os caracteres podem "empilhar" uns sobre os outros.
Neste exemplo, no início há gravidade para baixo ( v
), então c
, e
, g
, h
, i
, e j
cair fora da parte inferior do mapa. Todos os outros personagens deslizam para baixo até atingir uma parede, deixando o mapa assim:
.........#..
a..d......#.
#..#.f.....#
.b.#.#...###
.#.......#q#
.........###
Em seguida, passamos à gravidade para a direita ( >
), o que nos deixa com isso: Observe como as a
pilhas ao lado de d
.
.........#..
........ad#.
#..#......f#
..b#.#...###
.#.......#q#
.........###
Finalmente, simulamos a gravidade ascendente ( ^
), durante a qual o a
e o b
caem do mapa.
.........#..
.........d#.
#..#......f#
...#.#...###
.#.......#q#
.........###
Sua tarefa é produzir os caracteres restantes após as mudanças gravitacionais. Eles podem ser dados em qualquer ordem. Neste exemplo, você pode gerar qualquer permutação de dfq
.
Casos de teste
Para o seguinte mapa:
abcde
.....
##.##
v = abde
v> = <nothing>
Para o seguinte mapa:
######
#....#
abcdef
#.gh..
######
> = <nothing>
< = gh
^> = bcde
v< = bghef
Respostas:
JavaScript (ES6),
251233 bytesEditar: salvou 18 bytes graças a @WashingtonGuedes.
Funciona girando a grade de entrada quatro vezes para cada caractere direcional, mas na direção em que o caractere direcional corresponde ao caractere de loop, fazemos a coisa da gravidade esquerda. Pseudo-código:
fonte
JavaScript (ES6), 199
O mesmo algoritmo da resposta de @ Neil. A grade é girada quatro vezes para cada caractere direcional, quando na posição direita o deslocamento da gravidade para a esquerda é aplicado a cada linha.
fonte
Pitão, 143 bytes
(Nós realmente precisamos de tantos bytes?)
Experimente online!
Como funciona
Nós definimos uma função
left
que faz a coisa da gravidade para a esquerda.Em seguida, as outras direções são implementadas mexendo com a matriz, para que a direção desejada fique à esquerda, e faça
left
.O algoritmo de
left
está aqui:".X"
por"X."
, ondeX
representa uma letra.Todo o programa está dividido nas 6 seções a seguir:
Primeira sessão
Segunda seção
Terceira seção
Quarta seção
Quinta seção
Sexta seção
fonte
Ruby, 306 bytes
Função anônima. Técnica bastante tortuosa que provavelmente poderia ser otimizada.
fonte