Biorąc pod uwagę konfigurację domino, Twoim zadaniem jest dowiedzieć się, które domino spadają, a które nie.
Wejście
Weź prostokątną reprezentację ASCII konfiguracji domina. W siatce ASCII używane są następujące znaki:
(spacja): pusta komórka
|
,-
,/
,\
: Domino
Domino mogą spaść w 8 kierunkach, które są reprezentowane przez następujące litery (podobne do orientacji WASD):
Q W E
A D
Z X C
Jedna lub więcej domino zostanie zastąpiona jedną z tych liter, aby wskazać, że domino jest przesunięte na początku. Oto przykład:
D||||/
- /
- -
- -
/|||||
Nie chcę, aby to wyzwanie zamieniło się w ćwiczenie w analizowaniu danych wejściowych, dlatego dozwolone są dowolne z następujących formularzy wejściowych:
- Ciąg z siatką (opcjonalnie poprzedzony jego wymiarami, jeśli to pomaga)
- Tablica / lista / krotka z jednym ciągiem dla każdej linii (opcjonalnie wraz z liczbami całkowitymi szerokości i wysokości)
- (Zagnieżdżona) tablica / lista / krotka z jednym ciągiem / znakiem dla każdej komórki siatki (opcjonalnie wraz ze zmiennymi szerokości i wysokości)
Możesz czytać ze STDIN lub brać argument funkcji, a nawet oczekiwać, że dane wejściowe zostaną zapisane w zmiennej.
Wynik
Napisz do STDOUT lub zwróć (lub zapisz w zmiennej) wynikową siatkę w dowolnym poprawnym formacie wejściowym, wskazując, które domino spadły, a które nie. Oznacza to, że zamień każde upadłe domino na #
i pozostaw każde stojące domino tak, jak było na wejściu.
Zasady
Oczywiście domina propagują swój upadek poprzez konfigurację. Ponieważ mogą istnieć warunki wyścigu, zakładamy, że istnieją stałe przedziały czasowe, a opadanie propaguje jedną komórkę siatki na krok czasowy.
Domina ogólnie wypadają tak, jak byś się ich intuicyjnie spodziewał, ale rygorystyczna specyfikacja zdrowego rozsądku okazuje się dość długa. Przepraszam za to, mam nadzieję, że przykłady pomogą. Oto istota wszystkich unikalnych kombinacji dwóch kafelków (do obrotu i odbicia). Czytaj dalej, aby poznać rygorystyczne zasady.
Każde domino może spaść tylko w dwóch kierunkach:
W Q E
A | D - / \
X C Z
Ilekroć domino spada, wpływa na komórkę w kierunku upadku. Jeśli komórka zawiera domino, które może spaść w tym samym kierunku lub w kierunku różniącym się o 45 stopni, domino robi to w następnym kroku czasowym.
Przykłady:
D| -> DD (falls in same direction)
D/ -> DC (falls at 45 degrees)
C -> C (falls at 45 degrees)
- X
Za każdym razem, gdy spada domino ( /
lub \
) zorientowane po przekątnej , wpływa również na dwie komórki, które dotykają zarówno swojej komórki, jak i komórki w kierunku jej upadku. Jeśli komórki te zawierają domino, które może spaść w tym samym kierunku, co oryginalne domino lub w kierunku od siebie wyrównanym względem osi, domino zrobi to w następnym kroku czasowym.
Przykłady:
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\
Wyjątek : jeśli domino jest popychane jednocześnie w obu ważnych kierunkach (tj. Jeśli którakolwiek z powyższych reguł jest w konflikcie), nie spada.
Przykłady:
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)
Przykłady
8 5
D||||/ ######
- / - #
- - --> - #
- - - #
/||||| /|||||
===============================================
17 9
E|/|||/ #######
- - # #
- - # #
- - # #
/|||/|||||||||/ --> ###############
/ - # #
/ - # -
/ - # #
/|||||\ #######
===============================================
19 8
\|/ ###
- - # #
D||||/|\ /|||/ ######## #####
/ - # #
- \- --> - \#
\- \ - #- \ #
D||||\ / \ / ###### / \ #
|\ ||||| |\ #####
==============================================
11 11
-\\\/|\|\-| -\##/|###-|
-|\\||\-|\- -|#####-|\-
|\//\//|-/- |#//\//|#/-
\|//|-|\-\| #####-|##\|
---||/-\//| #-######//|
///|||\---- --> #/#####----
-|/---|-|-\ #|##--|-|-\
--|--\/|/// ####-\/|///
/|//--|//-| ####--|//-|
|/\-|||-/-\ |/\####-/-\
E||\-|\---/ ####-|\---/
Daj mi znać, jeśli uważasz, że popełniłem błąd (szczególnie z ostatnim).
E
(nie żeby miało to znaczenie ...). Wygląda na to, że możesz uratować wiele postaci, zmniejszając głębokość wcięć do absolutnego minimum.