Dada una configuración de fichas de dominó, su tarea es determinar qué fichas de dominó caen y cuáles no.
Entrada
Tome una representación rectangular ASCII de una configuración de dominó. Los siguientes caracteres se utilizan para la cuadrícula ASCII:
(espacio): celda vacía
|
,-
,/
,\
: Dominó
Las fichas de dominó pueden caer en 8 direcciones, que están representadas por las siguientes letras (similares a las orientaciones WASD):
Q W E
A D
Z X C
Una o más de las fichas de dominó serán reemplazadas por una de estas letras para indicar que la ficha de dominó se empuja al comienzo. Aquí hay un ejemplo:
D||||/
- /
- -
- -
/|||||
No quiero que este desafío se convierta en un ejercicio de análisis de entrada, por lo que se permite cualquiera de los siguientes formularios de entrada:
- Una cadena con la cuadrícula (opcionalmente precedida por sus dimensiones si eso ayuda)
- Una matriz / lista / tupla con una cadena para cada línea (opcionalmente junto con enteros de ancho y alto)
- Una matriz / lista / tupla (anidada) con una cadena / carácter para cada celda de la cuadrícula (opcionalmente junto con las variables de ancho y alto)
Puede leer desde STDIN o tomar un argumento de función o incluso esperar que la entrada se almacene en una variable.
Salida
Escriba en STDOUT o devuelva (o guarde en una variable) la cuadrícula resultante en cualquiera de los formatos de entrada válidos, indicando qué fichas de dominó han caído y cuáles no. Es decir, reemplace cada dominó caído con #
y deje cada dominó en pie como estaba en la entrada.
Reglas
Por supuesto, las fichas de dominó propagan su caída a través de la configuración. Como puede haber condiciones de carrera, suponemos que hay pasos de tiempo fijos y que la caída propaga una celda de cuadrícula por paso de tiempo.
Las fichas de dominó generalmente caen de la manera intuitiva en la que esperarías, pero una especificación rigurosa del sentido común resulta ser bastante larga. Lo siento, espero que los ejemplos ayuden. Aquí hay una esencia con todas las combinaciones únicas de dos fichas (hasta la rotación y la reflexión). Siga leyendo para conocer las rigurosas reglas.
Cada dominó puede caer en solo dos direcciones:
W Q E
A | D - / \
X C Z
Cada vez que cae un dominó, afecta a la célula en la dirección de la caída. Si esa celda contiene un dominó que puede caer en la misma dirección o en una dirección que difiere en 45 grados, ese dominó lo hace en el siguiente paso.
Ejemplos:
D| -> DD (falls in same direction)
D/ -> DC (falls at 45 degrees)
C -> C (falls at 45 degrees)
- X
Cada vez que cae un dominó ( /
o \
) orientado en diagonal , también afecta a las dos celdas que tocan tanto su celda como la celda en la dirección de su caída. Si estas celdas contienen un dominó que puede caer en la misma dirección que el dominó original, o en la dirección del eje alineado lejos de él, ese dominó lo hará en el siguiente paso.
Ejemplos:
C/ -> CC (the cell in the direction of the fall is the one below
the /, so it falls in the same direction)
C| -> CD (falls in the axis-aligned direction away from the C)
C- -> C- (the direction away from the Q is W,
or but neither - nor \ can fall to W)
C\ -> C\
Excepción : si un dominó se empuja en ambas direcciones válidas a la vez (es decir, si alguna de las reglas anteriores está en conflicto), no cae.
Ejemplos:
D|A -> D|A (central domino in pushed in both directions)
Z Z (although it's pushed in one direction by two dominoes
D\A -> D\A and in the other by only one, it doesn't fall)
X X (the domino is being pushed from two opposing sides
D-A -> DXA D and A, but neither is valid for that domino. Hence,
there is no conflict and the X can push the domino over)
Z Z (pushed in the same direction by two dominoes, so falls)
\A -> ZA
Z Z Z (once the conflict arises, the affected
\ -> Z -> Z domino is locked in its position and can't
D|A D|A D|A be pushed over by future dominoes)
Ejemplos
8 5
D||||/ ######
- / - #
- - --> - #
- - - #
/||||| /|||||
===============================================
17 9
E|/|||/ #######
- - # #
- - # #
- - # #
/|||/|||||||||/ --> ###############
/ - # #
/ - # -
/ - # #
/|||||\ #######
===============================================
19 8
\|/ ###
- - # #
D||||/|\ /|||/ ######## #####
/ - # #
- \- --> - \#
\- \ - #- \ #
D||||\ / \ / ###### / \ #
|\ ||||| |\ #####
==============================================
11 11
-\\\/|\|\-| -\##/|###-|
-|\\||\-|\- -|#####-|\-
|\//\//|-/- |#//\//|#/-
\|//|-|\-\| #####-|##\|
---||/-\//| #-######//|
///|||\---- --> #/#####----
-|/---|-|-\ #|##--|-|-\
--|--\/|/// ####-\/|///
/|//--|//-| ####--|//-|
|/\-|||-/-\ |/\####-/-\
E||\-|\---/ ####-|\---/
Avíseme si cree que cometí un error (especialmente con el último).
E
(no es que haga la diferencia ...). Parece que puede guardar un montón de caracteres al reducir las profundidades de sangría al mínimo.