Stack Cats est un langage réversible basé sur la pile. Sa nature réversible crée des boucles quelque peu étranges. Ce défi concerne la boucle conditionnelle (...)
. Lorsque ces boucles sont imbriquées de certaines manières, il est possible de transformer le code pour réduire la profondeur d'imbrication. Voici les règles (où A
et B
représentent des extraits arbitraires):
- Lorsqu'une boucle commence par une autre boucle, nous pouvons extraire la boucle intérieure vers l'avant:
((A)B)
devient(A)(B)
. - Lorsqu'une boucle se termine par une autre boucle, nous pouvons extraire la boucle interne jusqu'à la fin:
(B(A))
devient(B)(A)
. - Les boucles vides,,
()
peuvent être entièrement supprimées du programme. En corollaire (en conjonction avec les autres règles),((A))
est équivalent à(A)
.
Les boucles ne imbriquées qui restent sont de la forme (A(B)C)
, où A
, B
et ne C
sont pas vides.
Le défi
Vous disposez d'un programme Stack Cats valide et votre tâche consiste à réduire le niveau d'imbrication des boucles autant que possible, sans laisser de boucles vides, en utilisant les transformations ci-dessus.
Un programme Stack Cats valide ...
- ... se compose uniquement des personnages
()/\<>[]{}!"*+-:=ITX^_|
. - ... a une symétrie miroir (par exemple,
\(]{}!{}[)/
est un programme valide, mais/|/
ne l'est pas). - ... a correctement apparié et imbriqué
()
et{}
([]
,<>
et\/
n'a pas nécessairement besoin d'être apparié comme d'habitude, bien qu'ils apparaissent par paires en raison de l'exigence de symétrie miroir).
Vous pouvez prendre une chaîne ou une liste de caractères en entrée, mais la sortie doit être présentée dans le même format.
Vous pouvez écrire un programme ou une fonction et utiliser l'une de nos méthodes standard de réception d'entrée et de sortie. Notez que ces failles sont interdites par défaut.
Il s'agit de code-golf , donc la réponse valide la plus courte - mesurée en octets - l'emporte.
Cas de test
Les cas de test sont deux lignes chacun (entrée et sortie), séparés par des lignes vides. Notez qu'une sortie est vide. Vous devez également prendre en charge l'entrée vide (ce qui devrait entraîner une sortie vide).
(((=+|+=)))
(=+|+=)
({(=+|+=)})
({(=+|+=)})
((\)/)I(\(/))
(\)(/)I(\)(/)
(()()(())()())
((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)
(...)
boucles de type.
\^/
entre parenthèses?
(<|>((X((T)))[_]))
et (([_](((T))X))<|>)
.
((A)B(C))
deviendra donc (A)(B)(C)
dû aux règles 1 et 2 par la suite: ((A)B(C))
→ (A)(B(C))
(règle 1) → (A)(B)(C)
(règle 2).
()
, donc une entrée{{A}B}
restera telle quelle et ne sera pas extraite{A}{B}
aussi?