Stack Cats - это обратимый, основанный на стеке язык. Его обратимый характер создает несколько странные петли. Эта проблема об условном цикле (...)
. Когда эти циклы вложены определенным образом, можно преобразовать код, чтобы уменьшить глубину вложенности. Вот правила (где A
и B
обозначают произвольные фрагменты):
- Когда один цикл начинается с другого цикла, мы можем извлечь внутренний цикл вперед:
((A)B)
становится(A)(B)
. - Когда один цикл заканчивается другим циклом, мы можем извлечь внутренний цикл до конца:
(B(A))
становится(B)(A)
. - Пустые циклы
()
можно полностью удалить из программы. Как следствие (в сочетании с другими правилами),((A))
эквивалентно(A)
.
Единственные вложенные циклы , которые останутся имеют вид (A(B)C)
, где A
, B
и C
не пусты.
Соревнование
Вам дана действующая программа Stack Cats, и ваша задача - максимально снизить уровень вложенности циклов, не оставляя пустых циклов, используя приведенные выше преобразования.
Действительная программа Stack Cats ...
- ... состоит только из персонажей
()/\<>[]{}!"*+-:=ITX^_|
. - ... имеет зеркальную симметрию (например,
\(]{}!{}[)/
является допустимой программой, но/|/
не является). - ... правильно подобран и вложенный
()
и{}
([]
,<>
и\/
не обязательно должен быть согласована , как обычно, хотя они появляются пары в связи с требованием зеркальной симметрии).
В качестве входных данных вы можете взять строку или список символов, но выходные данные должны быть представлены в том же формате.
Вы можете написать программу или функцию и использовать любой из наших стандартных методов получения ввода и предоставления вывода. Обратите внимание, что эти лазейки по умолчанию запрещены.
Это код-гольф , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.
Тестовые случаи
Контрольные примеры - это две строки каждая (входная и выходная), разделенные пустыми строками. Обратите внимание, что один выход пуст. Вам также необходимо поддерживать пустой ввод (что должно привести к пустому выводу).
(((=+|+=)))
(=+|+=)
({(=+|+=)})
({(=+|+=)})
((\)/)I(\(/))
(\)(/)I(\)(/)
(()()(())()())
((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)
(...)
циклов -типа.
\^/
внутри скобок?
(<|>((X((T)))[_]))
и (([_](((T))X))<|>)
.
((A)B(C))
это станет (A)(B)(C)
результатом обоих правил 1 и 2: ((A)B(C))
→ (A)(B(C))
(правило 1) → (A)(B)(C)
(правило 2).
()
, то есть входные данные{{A}B}
останутся как есть и не будут извлечены{A}{B}
?