Wenn Sie eine Dominosteineinstellung haben, müssen Sie herausfinden, welche Dominosteine fallen und welche nicht.
Eingang
Nehmen Sie eine rechteckige ASCII-Darstellung eines Domino-Setups. Die folgenden Zeichen werden für das ASCII-Raster verwendet:
(Leerzeichen): leere Zelle
|
,-
,/
,\
: Domino
Dominosteine können in 8 Richtungen fallen, die durch die folgenden Buchstaben dargestellt werden (ähnlich den WASD-Ausrichtungen):
Q W E
A D
Z X C
Einer oder mehrere der Dominosteine werden durch einen dieser Buchstaben ersetzt, um anzuzeigen, dass der Dominostein beim Start verschoben wird. Hier ist ein Beispiel:
D||||/
- /
- -
- -
/|||||
Ich möchte nicht, dass diese Herausforderung zu einer Übung für das Parsen von Eingaben wird, daher sind die folgenden Eingabeformen zulässig:
- Eine Zeichenfolge mit dem Raster (optional mit vorangestelltem Wert, falls dies hilfreich ist)
- Ein Array / eine Liste / ein Tupel mit einer Zeichenfolge für jede Zeile (optional zusammen mit Ganzzahlen für Breite und Höhe)
- Ein (verschachteltes) Array / eine Liste / ein Tupel mit einer Zeichenfolge / einem Zeichen für jede Gitterzelle (optional zusammen mit den Variablen width und height)
Sie können aus STDIN lesen, ein Funktionsargument verwenden oder sogar erwarten, dass die Eingabe in einer Variablen gespeichert wird.
Ausgabe
Schreiben Sie in STDOUT oder geben Sie das resultierende Raster in einem der gültigen Eingabeformate zurück (oder speichern Sie es in einer Variablen) und geben Sie an, welche Dominosteine gefallen sind und welche nicht. Das heißt, ersetzen Sie jeden gefallenen Domino durch #
und lassen Sie jeden stehenden Domino so, wie er in der Eingabe war.
Regeln
Natürlich verbreiten Dominosteine ihren Sturz durch das Setup. Da es möglicherweise Rennbedingungen gibt, nehmen wir an, dass es feste Zeitschritte gibt und der Abfall eine Gitterzelle pro Zeitschritt ausbreitet.
Dominosteine fallen im Allgemeinen so aus, wie Sie es intuitiv erwarten würden, aber eine strenge Spezifikation des gesunden Menschenverstands erweist sich als ziemlich langwierig. Sorry dafür, ich hoffe die Beispiele helfen. Hier ist ein Überblick über alle einzigartigen Zwei-Kacheln-Kombinationen (bis hin zu Drehung und Reflexion). Lesen Sie weiter für die strengen Regeln.
Jeder Domino kann nur in zwei Richtungen fallen:
W Q E
A | D - / \
X C Z
Immer wenn ein Domino fällt, wirkt sich dies auf die Zelle in Fallrichtung aus. Wenn diese Zelle einen Domino enthält, der in dieselbe Richtung oder in eine um 45 Grad abweichende Richtung fallen kann, wird dieser Domino dies im nächsten Zeitschritt tun.
Beispiele:
D| -> DD (falls in same direction)
D/ -> DC (falls at 45 degrees)
C -> C (falls at 45 degrees)
- X
Wenn ein diagonal ausgerichteter Domino ( /
oder \
) fällt, wirkt sich dies auch auf die beiden Zellen aus, die sowohl seine Zelle als auch die Zelle in Fallrichtung berühren. Wenn diese Zellen einen Domino enthalten, der in die gleiche Richtung wie der ursprüngliche Domino oder in die von ihm weg ausgerichtete Richtung fallen kann, wird dieser Domino dies im nächsten Zeitschritt tun.
Beispiele:
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\
Ausnahme : Wenn ein Domino gleichzeitig in beide gültigen Richtungen verschoben wird (dh wenn eine der oben genannten Regeln in Konflikt steht), fällt er nicht.
Beispiele:
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)
Beispiele
8 5
D||||/ ######
- / - #
- - --> - #
- - - #
/||||| /|||||
===============================================
17 9
E|/|||/ #######
- - # #
- - # #
- - # #
/|||/|||||||||/ --> ###############
/ - # #
/ - # -
/ - # #
/|||||\ #######
===============================================
19 8
\|/ ###
- - # #
D||||/|\ /|||/ ######## #####
/ - # #
- \- --> - \#
\- \ - #- \ #
D||||\ / \ / ###### / \ #
|\ ||||| |\ #####
==============================================
11 11
-\\\/|\|\-| -\##/|###-|
-|\\||\-|\- -|#####-|\-
|\//\//|-/- |#//\//|#/-
\|//|-|\-\| #####-|##\|
---||/-\//| #-######//|
///|||\---- --> #/#####----
-|/---|-|-\ #|##--|-|-\
--|--\/|/// ####-\/|///
/|//--|//-| ####--|//-|
|/\-|||-/-\ |/\####-/-\
E||\-|\---/ ####-|\---/
Lassen Sie mich wissen, wenn Sie denken, dass ich einen Fehler gemacht habe (besonders mit dem letzten).
E
(nicht , dass es einen Unterschied macht ...). Anscheinend können Sie eine Reihe von Zeichen speichern, indem Sie die Einrückungstiefe auf ein Minimum reduzieren.