Враховуючи налаштування доміно, ваше завдання - з'ясувати, які доміно падіння, а які - ні.
Вхідні дані
Візьміть прямокутне зображення 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
(не те, що це має значення ...). Схоже, ви можете зберегти купу символів, зменшивши глибину відступу до мінімуму.