Pyth - мова для гольфу, заснована на Python. Він використовує позначення префікса, при цьому кожна команда має різну сутність (кількість аргументів, які вона приймає).
Ваше завдання - написати перевірку синтаксису для (неіснуючої) мови, схожої на Pyth, Pith.
Синтаксис Піта
Pith має лише 8 одночастотних команд:
01234()"
01234
кожен має сукупність відповідного числа, а тому очікуйте, що після нього буде багато аргументів. Наприклад,
400010
правильна програма Pith , тому що 4
слідують чотири аргументи 0
0
0
і 10
, останній з яких є 1
наступним єдиним аргументом 0
. Щоб візуалізувати це, ми можемо подивитися на таке дерево:
R
|
4
|
-------------
| | | |
0 0 0 1
|
0
де R
знаходиться кореневий вузол. Альтернативний спосіб подумати про це полягає в тому, що кожне число посилається на кількість дітей, які має відповідний вузол у дереві вище.
Ось ще одна дійсна програма Pith з більш ніж однією базовою командою:
210010
відповідна
R
|
-------------
| |
2 1
| |
--------- 0
| |
1 0
|
0
З іншої сторони,
3120102100
це НЕ правильна програма Pith , оскільки вихідний 3
має тільки два аргументи, які ми можемо побачити, подивившись на дерево нижче:
R
|
3
|
------------------------ ??
| |
1 2
| |
2 ------
| | |
------ 1 0
| | |
0 1 0
|
0
Далі (
починається без обмежень і )
закінчується без обмеження. Без обмежень приймає будь-яку кількість аргументів (жадібно) і вважається єдиним аргументом для будь-якої батьківської команди. Будь-які відкриті до кінця програми незв’язані обмеження автоматично закриваються. )
Команда не є помилкою , якщо немає unboundeds відкриті - це просто нічого не робить *.
Наприклад, програма Pith
)31(0)0(201000100
відповідає дереву
R
|
3
|
------------------------------
| | |
1 0 (
| |
( -----------------------------
| | | | | |
0 2 0 0 1 0
| |
------- 0
| |
0 1
|
0
Порожні незв’язані параметри нормально, так ()
це дійсна програма Pith.
Недійсна програма Pith з необмеженою є
12(010
оскільки 2
єдиний отримує один аргумент (необмежений).
Нарешті, "
починається і закінчується рядок, який завжди дорівнює 0 і вважається одним аргументом, наприклад
2"010""44)()4"
що є просто 2
істотою, що передається двома рядковими аргументами "010"
і "44)()4"
. Як і незв'язані, рядки також можуть бути порожніми, а будь-які незакриті рядки до кінця програми автоматично закриваються.
* Ця частина відрізняється від оригінального Pyth, який насправді робить щось у подібному випадку 1)
, закінчуючи 1-арність і створюючи помилку.
Введення-виведення
Введенням буде один непустий рядок, що складається лише з символів 01234()"
. Ви можете необов'язково припускати, що додатковий новий рядок завжди присутній. Ви можете написати функцію або повну програму для цього завдання.
Ви повинні вивести триєдне значення, якщо вхід є синтаксично дійсним Pith, або помилковим значенням є інше. Цінні і хибні значення повинні бути виправлені, тому ви не можете виводити 1
для однієї дійсної програми та 2
для іншої.
Оцінка балів
Це код-гольф, тому код у найменших байтах виграє.
Тестові справи
Truthy:
0
)
(
"
()
""
10
400010
210010
("")00
3"""""
(0)))0)1)0
2(2(2(0)0)0)0
2"010""44)()4"
)31(0)0(201000100
())2)1))0"3())"))
3("4321("301(0)21100"4")"123"00)40"121"31000""01010
Фальсі:
1
1(310
(1)0)
12(010
4"00010"
3120102100
20(2((0)(0)))
2(2(2(0)0)0)01)
4(0102)00)00000
2"00"("00"2(""))
())2)1))0"3())"))
(я думаю, це має бути правдою).
()210""
з великою кількістю
[( [2 [0] [1 [0] ] ] [0] [1 [0]] [0] ]
? У вас є гілки 2, 0, 0, 1 і 0 - другої там не повинно бути.