Stack Cats to odwracalny język oparty na stosie. Jego odwracalna natura tworzy nieco dziwne pętle. To wyzwanie dotyczy pętli warunkowej (...)
. Gdy te pętle są zagnieżdżone w określony sposób, możliwe jest przekształcenie kodu w celu zmniejszenia głębokości zagnieżdżenia. Oto zasady (gdzie A
i B
oznaczają dowolne fragmenty):
- Kiedy jedna pętla zaczyna się od innej, możemy wyodrębnić wewnętrzną pętlę do przodu:
((A)B)
staje się(A)(B)
. - Kiedy jedna pętla kończy się na drugiej, możemy wyodrębnić wewnętrzną pętlę do końca:
(B(A))
staje się(B)(A)
. - Puste pętle
()
można całkowicie usunąć z programu. Jako następstwo (w połączeniu z innymi zasadami)((A))
jest równoważne z(A)
.
Jedyne zagnieżdżonej pętli, które zachowują się w formie (A(B)C)
, gdzie A
, B
a C
to nie jest pusty.
Wyzwanie
Otrzymałeś prawidłowy program Stack Cats, a Twoim zadaniem jest maksymalne zmniejszenie poziomu zagnieżdżania pętli, bez pozostawiania pustych pętli, przy użyciu powyższych transformacji.
Prawidłowy program Stack Cats ...
- ... składa się tylko z postaci
()/\<>[]{}!"*+-:=ITX^_|
. - ... ma symetrię lustrzaną (np.
\(]{}!{}[)/
jest poprawnym programem, ale/|/
nie jest). - ... prawidłowo dobrane i zagnieżdżone
()
i{}
([]
,<>
i\/
niekoniecznie muszą być dopasowane, jak zwykle, chociaż oni pojawiają się w parach ze względu na wymóg symetrii lustrzanej).
Jako dane wejściowe możesz wziąć ciąg znaków lub listę znaków, ale dane wyjściowe muszą być prezentowane w tym samym formacie.
Możesz napisać program lub funkcję i użyć dowolnej z naszych standardowych metod otrzymywania danych wejściowych i dostarczania danych wyjściowych. Pamiętaj, że te luki są domyślnie zabronione.
To jest golf golfowy , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .
Przypadki testowe
Przypadki testowe składają się z dwóch linii (wejściowej i wyjściowej), oddzielonych pustymi liniami. Zauważ, że jedno wyjście jest puste. Musisz także obsługiwać puste dane wejściowe (co powinno skutkować pustymi danymi wyjściowymi).
(((=+|+=)))
(=+|+=)
({(=+|+=)})
({(=+|+=)})
((\)/)I(\(/))
(\)(/)I(\)(/)
(()()(())()())
((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)
(...)
pętli typu.
\^/
w nawiasie?
(<|>((X((T)))[_]))
i (([_](((T))X))<|>)
.
((A)B(C))
będzie (A)(B)(C)
ze względu na obu reguł 1 i 2 kolejno: ((A)B(C))
→ (A)(B(C))
(zasada 1) → (A)(B)(C)
(reguła 2).
()
, więc dane wejściowe{{A}B}
pozostaną takie, jakie są i do których nie zostaną również wyodrębnione{A}{B}
?