Étant donné une configuration de dominos, votre tâche consiste à déterminer quels dominos tombent et lesquels ne le font pas.
Contribution
Prenez une représentation ASCII rectangulaire d'une configuration domino. Les caractères suivants sont utilisés pour la grille ASCII:
(espace): cellule vide
|
,-
,/
,\
: Dominos
Les dominos peuvent tomber dans 8 directions, qui sont représentées par les lettres suivantes (similaires aux orientations WASD):
Q W E
A D
Z X C
Un ou plusieurs dominos seront remplacés par l'une de ces lettres pour indiquer que le domino est poussé au début. Voici un exemple:
D||||/
- /
- -
- -
/|||||
Je ne veux pas que ce défi se transforme en un exercice d'analyse syntaxique, donc l'un des formulaires de saisie suivants est autorisé:
- Une chaîne avec la grille (éventuellement précédée de ses dimensions si cela vous aide)
- Un tableau / liste / tuple avec une chaîne pour chaque ligne (éventuellement avec des entiers de largeur et de hauteur)
- Un tableau / liste / tuple (imbriqué) avec une chaîne / caractère pour chaque cellule de la grille (éventuellement avec des variables de largeur et de hauteur)
Vous pouvez lire à partir de STDIN ou prendre un argument de fonction ou même vous attendre à ce que l'entrée soit stockée dans une variable.
Production
Écrivez dans STDOUT ou renvoyez (ou enregistrez dans une variable) la grille résultante dans l'un des formats d'entrée valides, indiquant quels dominos sont tombés et lesquels ne l'ont pas été. Autrement dit, remplacez chaque domino tombé par #
et laissez chaque domino debout tel qu'il était dans l'entrée.
Règles
Bien sûr, les dominos propagent leur chute à travers l'installation. Comme il peut y avoir des conditions de concurrence, nous supposons qu'il y a des pas de temps fixes et que la chute propage une cellule de grille par pas de temps.
Les dominos tombent généralement comme vous vous y attendez intuitivement, mais une spécification rigoureuse de bon sens s'avère assez longue. Désolé pour cela, j'espère que les exemples vous aideront. Voici un résumé avec toutes les combinaisons uniques de deux carreaux (jusqu'à la rotation et la réflexion). Lisez la suite pour les règles rigoureuses.
Chaque domino ne peut tomber que dans deux directions:
W Q E
A | D - / \
X C Z
Chaque fois qu'un domino tombe, il affecte la cellule dans le sens de la chute. Si cette cellule contient un domino qui peut tomber dans la même direction ou dans une direction qui diffère de 45 degrés, ce domino le fait au pas de temps suivant.
Exemples:
D| -> DD (falls in same direction)
D/ -> DC (falls at 45 degrees)
C -> C (falls at 45 degrees)
- X
Chaque fois qu'un domino orienté en diagonale ( /
ou\
) tombe, il affecte également les deux cellules qui touchent à la fois sa cellule et la cellule dans le sens de sa chute. Si ces cellules contiennent un domino qui peut tomber dans la même direction que le domino d'origine, ou dans le sens de l'axe qui s'éloigne de lui, ce domino le fait au pas de temps suivant.
Exemples:
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\
Exception : si un domino est poussé dans les deux directions valides à la fois (c'est-à-dire si l'une des règles ci-dessus est en conflit), il ne tombe pas.
Exemples:
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)
Exemples
8 5
D||||/ ######
- / - #
- - --> - #
- - - #
/||||| /|||||
===============================================
17 9
E|/|||/ #######
- - # #
- - # #
- - # #
/|||/|||||||||/ --> ###############
/ - # #
/ - # -
/ - # #
/|||||\ #######
===============================================
19 8
\|/ ###
- - # #
D||||/|\ /|||/ ######## #####
/ - # #
- \- --> - \#
\- \ - #- \ #
D||||\ / \ / ###### / \ #
|\ ||||| |\ #####
==============================================
11 11
-\\\/|\|\-| -\##/|###-|
-|\\||\-|\- -|#####-|\-
|\//\//|-/- |#//\//|#/-
\|//|-|\-\| #####-|##\|
---||/-\//| #-######//|
///|||\---- --> #/#####----
-|/---|-|-\ #|##--|-|-\
--|--\/|/// ####-\/|///
/|//--|//-| ####--|//-|
|/\-|||-/-\ |/\####-/-\
E||\-|\---/ ####-|\---/
Faites-moi savoir si vous pensez que j'ai fait une erreur (surtout avec la dernière).
E
(pas que cela fasse une différence ...). Il semble que vous puissiez enregistrer un tas de caractères en réduisant les profondeurs d'indentation au strict minimum.