Data una configurazione di domino, il tuo compito è capire quali domino cadono e quali no.
Ingresso
Prendi una rappresentazione ASCII rettangolare di un'installazione domino. I seguenti caratteri vengono utilizzati per la griglia ASCII:
(spazio): cella vuota
|
,-
,/
,\
: Domino
I domino possono cadere in 8 direzioni, che sono rappresentate dalle seguenti lettere (simili agli orientamenti WASD):
Q W E
A D
Z X C
Uno o più domino verranno sostituiti da una di queste lettere per indicare che il domino viene spostato all'inizio. Ecco un esempio:
D||||/
- /
- -
- -
/|||||
Non voglio che questa sfida si trasformi in un esercizio di analisi dell'input, quindi è consentito uno dei seguenti moduli di input:
- Una stringa con la griglia (facoltativamente preceduta dalle sue dimensioni se ciò aiuta)
- Un array / elenco / tupla con una stringa per ogni riga (facoltativamente insieme a numeri interi di larghezza e altezza)
- Una matrice / elenco / tupla (nidificata) con una stringa / carattere per ogni cella della griglia (facoltativamente insieme a variabili di larghezza e altezza)
È possibile leggere da STDIN o accettare un argomento di funzione o addirittura aspettarsi che l'input venga archiviato in una variabile.
Produzione
Scrivi a STDOUT o restituisci (o salva in una variabile) la griglia risultante in uno dei formati di input validi, indicando quali domino sono caduti e quali no. Cioè, sostituisci ogni domino caduto con #
e lascia ogni domino in piedi com'era nell'input.
Regole
Naturalmente, i domino propagano la loro caduta attraverso l'installazione. Poiché potrebbero esserci condizioni di gara, assumiamo che vi siano fasi temporali fisse e che la caduta propaga una cella della griglia per fase temporale.
I domino generalmente cadono come ci si aspetterebbe intuitivamente da loro, ma una specifica rigorosa di buon senso si rivela abbastanza lunga. Scusatemi, spero che gli esempi siano d'aiuto. Ecco un riassunto con tutte le combinazioni uniche di due tessere (fino a rotazione e riflessione). Continua a leggere per le regole rigorose.
Ogni domino può cadere solo in due direzioni:
W Q E
A | D - / \
X C Z
Ogni volta che un domino cade, colpisce la cellula nella direzione della caduta. Se quella cella contiene un domino che può cadere nella stessa direzione o in una direzione che differisce di 45 gradi, quel domino lo fa nella fase successiva.
Esempi:
D| -> DD (falls in same direction)
D/ -> DC (falls at 45 degrees)
C -> C (falls at 45 degrees)
- X
Ogni volta che un domino ( /
o \
) orientato in diagonale cade, colpisce anche le due cellule che toccano sia la sua cellula che la cellula nella direzione della sua caduta. Se queste celle contengono un domino che può cadere nella stessa direzione del domino originale, o nella direzione allineata all'asse lontano da esso, quel domino lo fa nella fase successiva.
Esempi:
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\
Eccezione : se un domino viene spinto contemporaneamente in entrambe le direzioni valide (ovvero se una delle regole di cui sopra è in conflitto), non cade.
Esempi:
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)
Esempi
8 5
D||||/ ######
- / - #
- - --> - #
- - - #
/||||| /|||||
===============================================
17 9
E|/|||/ #######
- - # #
- - # #
- - # #
/|||/|||||||||/ --> ###############
/ - # #
/ - # -
/ - # #
/|||||\ #######
===============================================
19 8
\|/ ###
- - # #
D||||/|\ /|||/ ######## #####
/ - # #
- \- --> - \#
\- \ - #- \ #
D||||\ / \ / ###### / \ #
|\ ||||| |\ #####
==============================================
11 11
-\\\/|\|\-| -\##/|###-|
-|\\||\-|\- -|#####-|\-
|\//\//|-/- |#//\//|#/-
\|//|-|\-\| #####-|##\|
---||/-\//| #-######//|
///|||\---- --> #/#####----
-|/---|-|-\ #|##--|-|-\
--|--\/|/// ####-\/|///
/|//--|//-| ####--|//-|
|/\-|||-/-\ |/\####-/-\
E||\-|\---/ ####-|\---/
Fammi sapere se pensi che ho fatto un errore (soprattutto con l'ultimo).
E
(non che fa la differenza ...). Sembra che puoi salvare un sacco di personaggi riducendo le profondità di rientro al minimo indispensabile.