Dada uma configuração de dominós, sua tarefa é descobrir quais dominós caem e quais não.
Entrada
Tome uma representação ASCII retangular de uma configuração de dominó. Os seguintes caracteres são usados para a grade ASCII:
(espaço): célula vazia
|
,-
,/
,\
: Dominós
Os dominós podem cair em 8 direções, representadas pelas seguintes letras (semelhantes às orientações da WASD):
Q W E
A D
Z X C
Um ou mais dominós serão substituídos por uma dessas letras para indicar que o dominó é empurrado no início. Aqui está um exemplo:
D||||/
- /
- -
- -
/|||||
Não quero que esse desafio se transforme em um exercício de análise de entrada, para que qualquer um dos seguintes formulários de entrada seja permitido:
- Uma sequência com a grade (opcionalmente precedida por suas dimensões, se isso ajudar)
- Uma matriz / lista / tupla com uma sequência para cada linha (opcionalmente juntamente com números inteiros de largura e altura)
- Uma matriz / lista / tupla (aninhada) com uma sequência / caractere para cada célula da grade (opcionalmente, juntamente com variáveis de largura e altura)
Você pode ler de STDIN ou usar um argumento de função ou até esperar que a entrada seja armazenada em uma variável.
Resultado
Escreva para STDOUT ou retorne (ou salve em uma variável) a grade resultante em qualquer um dos formatos de entrada válidos, indicando quais dominós caíram e quais não. Ou seja, substitua cada dominó caído por #
e deixe cada dominó em pé como estava na entrada.
Regras
Obviamente, os dominós propagam sua queda através da instalação. Como pode haver condições de corrida, assumimos que existem etapas de tempo fixas e a queda propaga uma célula da grade por etapa de tempo.
Os dominós geralmente caem da maneira que você esperaria intuitivamente, mas uma especificação rigorosa do senso comum acaba sendo bastante longa. Desculpe por isso, espero que os exemplos ajudem. Aqui está uma essência com todas as combinações únicas de dois ladrilhos (até rotação e reflexão). Leia sobre as regras rigorosas.
Cada dominó pode cair em apenas duas direções:
W Q E
A | D - / \
X C Z
Sempre que um dominó cai, isso afeta a célula na direção da queda. Se essa célula contiver um dominó que pode cair na mesma direção ou em uma direção que difere em 45 graus, esse dominó o fará no próximo passo.
Exemplos:
D| -> DD (falls in same direction)
D/ -> DC (falls at 45 degrees)
C -> C (falls at 45 degrees)
- X
Sempre que um dominó ( /
ou \
) orientado na diagonal cai, também afeta as duas células que tocam na célula e na célula na direção de sua queda. Se essas células contiverem um dominó que pode cair na mesma direção que o dominó original ou na direção alinhada pelo eixo, o dominó o fará no próximo passo.
Exemplos:
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\
Exceção : se um dominó for empurrado nas duas direções válidas de uma só vez (ou seja, se alguma das regras acima estiver em conflito), ela não cairá.
Exemplos:
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)
Exemplos
8 5
D||||/ ######
- / - #
- - --> - #
- - - #
/||||| /|||||
===============================================
17 9
E|/|||/ #######
- - # #
- - # #
- - # #
/|||/|||||||||/ --> ###############
/ - # #
/ - # -
/ - # #
/|||||\ #######
===============================================
19 8
\|/ ###
- - # #
D||||/|\ /|||/ ######## #####
/ - # #
- \- --> - \#
\- \ - #- \ #
D||||\ / \ / ###### / \ #
|\ ||||| |\ #####
==============================================
11 11
-\\\/|\|\-| -\##/|###-|
-|\\||\-|\- -|#####-|\-
|\//\//|-/- |#//\//|#/-
\|//|-|\-\| #####-|##\|
---||/-\//| #-######//|
///|||\---- --> #/#####----
-|/---|-|-\ #|##--|-|-\
--|--\/|/// ####-\/|///
/|//--|//-| ####--|//-|
|/\-|||-/-\ |/\####-/-\
E||\-|\---/ ####-|\---/
Deixe-me saber se você acha que eu cometi um erro (especialmente com o último).
E
(não que isso faça diferença ...). Parece que você pode salvar vários caracteres, reduzindo as profundidades de recuo ao mínimo.