Учитывая настройку домино, ваша задача выяснить, какие домино падают, а какие нет.
вход
Возьмите прямоугольное ASCII представление настройки домино. Следующие символы используются для сетки ASCII:
(пробел): пустая ячейка
|
,-
,/
,\
: Домино
Домино может падать в 8 направлениях, которые представлены следующими буквами (аналогично ориентации WASD):
Q W E
A D
Z X C
Одно или несколько домино будут заменены одной из этих букв, чтобы указать, что домино перевернуто с самого начала. Вот пример:
D||||/
- /
- -
- -
/|||||
Я не хочу, чтобы этот вызов превратился в упражнение при разборе ввода, поэтому допускается любая из следующих форм ввода:
- Строка с сеткой (необязательно с предшествующими ее размерами, если это помогает)
- Массив / список / кортеж с одной строкой для каждой строки (опционально вместе с целыми числами ширины и высоты)
- (Вложенный) массив / список / кортеж с одной строкой / символом для каждой ячейки сетки (необязательно вместе с переменными ширины и высоты)
Вы можете читать из STDIN или принимать аргумент функции или даже ожидать, что ввод будет сохранен в переменной.
Выход
Записать в STDOUT или вернуть (или сохранить в переменной) результирующую сетку в любом из допустимых форматов ввода, указав, какие домино упали, а какие - нет. То есть замените каждое упавшее домино на#
и оставьте каждое стоящее домино таким, каким оно было на входе.
правила
Конечно, домино распространяют свое падение через установку. Поскольку могут быть условия гонки, мы предполагаем, что существуют фиксированные временные шаги, и падение распространяется на одну ячейку сетки за временной шаг.
Домино, как правило, падает так, как вы ожидаете, но строгая спецификация здравого смысла оказывается довольно продолжительной. Извините за это, надеюсь, примеры помогут. Вот суть всех уникальных комбинаций из двух плиток (до поворота и отражения). Продолжайте читать для строгих правил.
Каждое домино может упасть только в двух направлениях:
W Q E
A | D - / \
X C Z
Всякий раз, когда домино падает, оно воздействует на клетку в направлении падения. Если в этой ячейке есть домино, которое может падать в том же направлении или в направлении, отличающемся на 45 градусов, то это происходит в следующем шаге времени.
Примеры:
D| -> DD (falls in same direction)
D/ -> DC (falls at 45 degrees)
C -> C (falls at 45 degrees)
- X
Всякий раз, когда по диагонали ориентировано домино ( /
или\
), падает, оно также воздействует на две клетки, которые касаются как его клетки, так и клетки в направлении ее падения. Если эти клетки содержат домино, которое может падать в том же направлении, что и исходное домино, или в направлении, ориентированном по оси от него, это домино делает это на следующем шаге по времени.
Примеры:
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\
Исключение : если домино выдвигается одновременно в обоих действительных направлениях (т. Е. Если какое-либо из вышеуказанных правил находится в конфликте), оно не падает.
Примеры:
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)
Примеры
8 5
D||||/ ######
- / - #
- - --> - #
- - - #
/||||| /|||||
===============================================
17 9
E|/|||/ #######
- - # #
- - # #
- - # #
/|||/|||||||||/ --> ###############
/ - # #
/ - # -
/ - # #
/|||||\ #######
===============================================
19 8
\|/ ###
- - # #
D||||/|\ /|||/ ######## #####
/ - # #
- \- --> - \#
\- \ - #- \ #
D||||\ / \ / ###### / \ #
|\ ||||| |\ #####
==============================================
11 11
-\\\/|\|\-| -\##/|###-|
-|\\||\-|\- -|#####-|\-
|\//\//|-/- |#//\//|#/-
\|//|-|\-\| #####-|##\|
---||/-\//| #-######//|
///|||\---- --> #/#####----
-|/---|-|-\ #|##--|-|-\
--|--\/|/// ####-\/|///
/|//--|//-| ####--|//-|
|/\-|||-/-\ |/\####-/-\
E||\-|\---/ ####-|\---/
Дайте мне знать, если вы считаете, что я допустил ошибку (особенно с последней).
E
(не то, чтобы это имело значение ...). Похоже, вы можете сохранить кучу символов, уменьшив глубину отступа до минимума.