Ви повинні написати програму або функцію, яка отримує рядок як вхід і вихід або повертається, якщо вхід є деревом ASCII.
_
\/ /
\_/
|
|
Дерева ASCII складаються з символів / \ | _ spaces
і newlines
.
Символи, що не містять пробілів, з'єднують дві крайові точки їх комірок лінійним відрізком:
/
з'єднує нижній лівий і верхній правий кути\
з'єднує нижній правий і верхній лівий кути|
з'єднує середні точки нижнього краю та верхнього краю_
з'єднує нижній лівий і нижній правий кути і середню точку нижнього краю
(Зверніть увагу , що це означає , що |
можна підключити тільки |
або , _
але не з /
або \
.)
Зображення ASCII називається деревом, якщо застосовуються такі правила:
- Рівно одна точка (корінь) рівно одного символу торкається нижнього краю останнього ряду.
Ви можете дістатися до будь-якої точки будь-якого сегмента лінії:
- починаючи від кореня
- використовуючи лише відрізки рядків
- ніколи не йдучи вниз (навіть не вниз)
Вхідні дані
- Рядок, що складається з символів
/ \ | _ space
іnewline
містить принаймні один символ, який не є пробілом. Ви можете вибрати два вхідні формати:
- Немає зайвого пробілу навколо дерева (як видно з прикладів).
- Немає зайвого пробілу навколо дерева (як це показано в прикладах), крім пробілів у правій частині рядків, щоб усі рядки були однакової довжини.
Новий рядок не є обов'язковим.
Вихідні дані
- Послідовне значення truthy, якщо вхід є деревом ascii.
- Послідовне хибне значення, якщо вхід не є деревом ascii.
Приклади
Дійсні дерева:
|
_
\/ /
\_/
|
|
/ / \/
\ \____/
\/
/
/
\___/
/ \
\___/
|
|
__/
_/
/
____
\ ___
\ \/
\/\_____/
\/ \/
\__/
|
|
Недійсні дерева (з додатковими поясненнями, які не є частинами даних):
\/
\_______/
\__ /
| \_/ <- reachable only on with downward route
|
_ <- multiple roots
\/ <- multiple root characters
/\ <- multiple roots
| <- unreachable part
|
__/
/ <- unreachable parts
|
\____/
| | <- multiple roots
_\__/ <- unreachable parts (_ and \ don't connect to each other)
|
Це кодовий гольф, тому найкоротший запис виграє.