Напишите программу, которая принимает строку из четырех символов, ()[]
которая удовлетворяет этим требованиям:
- Каждая левая скобка
(
имеет соответствующую правую скобку)
. - Каждая левая скобка
[
имеет соответствующую правую скобку]
. - Соответствующие пары скобок и скобок не будут перекрываться. Например
[(])
, недопустимо, потому что соответствующие скобки не полностью содержатся в соответствующих скобках, и наоборот. - Первый и последний символы - это совпадающая пара скобок или скобок. Так
([]([]))
и[[]([])]
есть, но[]([])
это не так.
( Грамматика для формата ввода есть <input> ::= [<input>*] | (<input>*)
.)
Каждая пара соответствующих скобок и скобок оценивается как неотрицательное целое число:
- Значения пар внутри соответствующих скобок суммируются . Пустое совпадение
()
имеет значение0
. - Значения пар внутри соответствующих скобок умножаются . Пустое совпадение
[]
имеет значение1
.
( Сумма или произведение одного числа является тем же самым числом.)
Например, ([](())([][])[()][([[][]][][])([][])])
может быть разбит и оценен как 9
:
([](())([][])[()][([[][]][][])([][])]) <input>
(1 (0 )(1 1 )[0 ][([1 1 ]1 1 )(1 1 )]) <handle empty matches>
(1 0 2 0 [(1 1 1 )2 ]) <next level of matches>
(1 0 2 0 [3 2 ]) <and the next>
(1 0 2 0 6 ) <and the next>
9 <final value to output>
Другой пример:
[([][][][][])([][][])([][][])(((((([][]))))))] <input>
[(1 1 1 1 1 )(1 1 1 )(1 1 1 )((((((1 1 ))))))]
[5 3 3 (((((2 )))))]
[5 3 3 ((((2 ))))]
[5 3 3 (((2 )))]
[5 3 3 ((2 ))]
[5 3 3 (2 )]
[5 3 3 2 ]
90 <output>
Ваша программа должна оценить и напечатать целое число, представленное всей входной строкой. Вы можете предположить, что ввод действителен. Самый короткий код в байтах побеждает.
Вместо программы вы можете написать функцию, которая принимает строку и печатает или возвращает целое число.