Stack Cats es un lenguaje reversible basado en pila. Su naturaleza reversible crea bucles algo extraños. Este desafío es sobre el ciclo condicional (...). Cuando estos bucles se anidan de ciertas maneras, es posible transformar el código para reducir la profundidad de anidación. Estas son las reglas (dónde Ay Brepresentan fragmentos arbitrarios):
- Cuando un ciclo comienza con otro ciclo, podemos extraer el ciclo interno al frente: se
((A)B)convierte(A)(B). - Cuando un ciclo termina con otro ciclo, podemos extraer el ciclo interno hasta el final: se
(B(A))convierte(B)(A). - Los bucles vacíos
(), se pueden eliminar del programa por completo. Como corolario (en conjunción con las otras reglas),((A))es equivalente a(A).
Los bucles anidados única que permanecerán son de la forma (A(B)C), donde A, By Cson no vacío.
El reto
Se le proporciona un programa válido de Stack Cats y su tarea es reducir el nivel de anidamiento de los bucles tanto como sea posible, sin dejar bucles vacíos, utilizando las transformaciones anteriores.
Un programa válido de Stack Cats ...
- ... consta solo de los personajes
()/\<>[]{}!"*+-:=ITX^_|. - ... tiene simetría de espejo (por ejemplo,
\(]{}!{}[)/es un programa válido, pero/|/no lo es). - ... ha emparejado correctamente y anidado
()y{}([],<>y\/no necesariamente tienen que ser igualado como de costumbre, a pesar de que aparecerán en parejas debido al requisito de simetría de espejo).
Puede tomar una cadena o una lista de caracteres como entrada, pero la salida debe presentarse en el mismo formato.
Puede escribir un programa o una función y utilizar cualquiera de nuestros métodos estándar para recibir entradas y proporcionar salidas. Tenga en cuenta que estas lagunas están prohibidas de forma predeterminada.
Este es el código de golf , por lo que gana la respuesta válida más corta, medida en bytes .
Casos de prueba
Los casos de prueba son dos líneas cada uno (entrada y salida), separados por líneas vacías. Tenga en cuenta que una salida está vacía. También debe admitir la entrada vacía (que debería dar como resultado una salida vacía).
(((=+|+=)))
(=+|+=)
({(=+|+=)})
({(=+|+=)})
((\)/)I(\(/))
(\)(/)I(\)(/)
(()()(())()())
((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)
(...)bucles de tipo.
\^/dentro del paréntesis?
(<|>((X((T)))[_]))y (([_](((T))X))<|>).
((A)B(C))se volverá (A)(B)(C)debido a las reglas 1 y 2 posteriormente: ((A)B(C))→ (A)(B(C))(regla 1) → (A)(B)(C)(regla 2).
(), por lo que una entrada{{A}B}permanecerá como está y no se extraerá{A}{B}también.