Desafío
Se le da una representación ASCII-art de caracteres en un plano como entrada por cualquier método razonable. Esto solo contendrá:
[a-z]
representando personajes movibles. Cada letra aparecerá en la pizarra como máximo una vez.#
representando paredes inamovibles.
representando el espacio vacío
Por ejemplo:
abcdef.gh#..
.......ij.#.
#..#.......#
...#.#...###
.#.......#q#
.........###
También se le da una cadena que representa los cambios en la gravedad. Esto solo contendrá:
>
representando un cambio a la gravedad hacia la derecha<
representando un cambio a la gravedad hacia la izquierda^
representando un cambio a la gravedad ascendentev
representando un cambio a la gravedad descendente
Por ejemplo:
v>^
Su programa debe simular cada cambio de gravedad secuencialmente hasta que todos los personajes dejen de moverse (golpean una pared u otro personaje). Los personajes que "caen del borde del mapa" se eliminan permanentemente, y los personajes pueden "apilarse" uno encima del otro.
En este ejemplo, en el inicio hay gravedad hacia abajo ( v
), por lo que c
, e
, g
, h
, i
, y j
caen fuera de la parte inferior del mapa. Todos los demás personajes se deslizan hacia abajo hasta golpear una pared, dejando el mapa así:
.........#..
a..d......#.
#..#.f.....#
.b.#.#...###
.#.......#q#
.........###
Luego, pasamos a la gravedad hacia la derecha ( >
), lo que nos deja con esto: tenga en cuenta cómo las a
pilas al lado de d
.
.........#..
........ad#.
#..#......f#
..b#.#...###
.#.......#q#
.........###
Finalmente, simulamos la gravedad hacia arriba ( ^
), durante la cual la a
y la b
caída del mapa.
.........#..
.........d#.
#..#......f#
...#.#...###
.#.......#q#
.........###
Su tarea es generar los caracteres restantes después de los cambios gravitacionales. Se pueden dar en cualquier orden. Para este ejemplo, puede generar cualquier permutación de dfq
.
Casos de prueba
Para el siguiente mapa:
abcde
.....
##.##
v = abde
v> = <nothing>
Para el siguiente mapa:
######
#....#
abcdef
#.gh..
######
> = <nothing>
< = gh
^> = bcde
v< = bghef
Respuestas:
JavaScript (ES6),
251233 bytesEditar: 18 bytes guardados gracias a @WashingtonGuedes.
Funciona girando la cuadrícula de entrada cuatro veces para cada carácter direccional, pero en la dirección donde el carácter direccional coincide con el carácter de bucle, hacemos lo de la gravedad izquierda. Pseudocódigo:
fuente
JavaScript (ES6), 199
El mismo algoritmo de la respuesta de @ Neil. La cuadrícula se gira cuatro veces para cada carácter direccional, cuando en la posición derecha se aplica el desplazamiento de gravedad a la izquierda a cada fila.
fuente
Pyth, 143 bytes
(¿Realmente necesitamos tantos bytes?)
Pruébalo en línea!
Cómo funciona
Definimos una función
left
que hace lo de la gravedad hacia la izquierda.Luego, las otras direcciones se implementan jugando con la matriz de modo que la dirección deseada esté hacia la izquierda, luego hazlo
left
.El algoritmo de
left
está aquí:".X"
con"X."
, dondeX
representa una letra.Todo el programa se divide en las siguientes 6 secciones:
Primera sección
Segunda sección
Tercera sección
Cuarta sección
Quinta sección
Sexta sección
fuente
Rubí, 306 bytes
Función anónima. Técnica bastante tortuosa que probablemente podría optimizarse.
fuente