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}?