Stack Cats è un linguaggio reversibile e basato su stack. La sua natura reversibile crea anelli piuttosto strani. Questa sfida riguarda il ciclo condizionale (...). Quando questi loop sono nidificati in determinati modi, è possibile trasformare il codice per ridurre la profondità di annidamento. Ecco le regole (dove AeB rappresentano uno snippet arbitrario):
- Quando un loop inizia con un altro loop, possiamo estrarre il loop interno in primo piano:
((A)B)diventa(A)(B). - Quando un loop termina con un altro loop, possiamo estrarre il loop interno fino alla fine:
(B(A))diventa(B)(A). - I loop vuoti
(), possono essere completamente rimossi dal programma. Come corollario (in combinato disposto con le altre regole),((A))equivale a(A).
Gli unici loop nidificati che rimarranno sono della forma (A(B)C), dove A,B e Csono non vuoti.
La sfida
Ti viene dato un programma Stack Cats valido e il tuo compito è ridurre il livello di annidamento dei loop il più possibile, senza lasciare loop vuoti, utilizzando le trasformazioni di cui sopra.
Un programma Stack Cats valido ...
- ... consiste solo dei personaggi
()/\<>[]{}!"*+-:=ITX^_|. - ... ha una simmetria speculare (ad es.
\(]{}!{}[)/è un programma valido, ma/|/non lo è). - ... è abbinato correttamente e annidati
()e{}([],<>e\/non devono necessariamente essere accompagnato come al solito, anche se appariranno a coppie a causa del requisito simmetria speculare).
Puoi prendere una stringa o un elenco di caratteri come input, ma l'output deve essere presentato nello stesso formato.
È possibile scrivere un programma o una funzione e utilizzare uno qualsiasi dei nostri metodi standard per ricevere input e fornire output. Si noti che queste lacune sono vietate per impostazione predefinita.
Questo è code-golf , quindi la risposta valida più breve - misurata in byte - vince.
Casi test
I casi di test sono due righe ciascuno (input e output), separati da righe vuote. Si noti che un output è vuoto. È inoltre necessario supportare l'input vuoto (che dovrebbe risultare in output vuoto).
(((=+|+=)))
(=+|+=)
({(=+|+=)})
({(=+|+=)})
((\)/)I(\(/))
(\)(/)I(\)(/)
(()()(())()())
((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)
(...)loop di tipo.
\^/racchiuso tra parentesi?
(<|>((X((T)))[_]))e (([_](((T))X))<|>).
((A)B(C))diventerà (A)(B)(C)dovuto a entrambe le regole 1 e 2 successivamente: ((A)B(C))→ (A)(B(C))(regola 1) → (A)(B)(C)(regola 2).
(), quindi un input{{A}B}rimarrà così com'è e non verrà estratto{A}{B}anche?