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 A
eB
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 C
sono 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?