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 A
y B
representan 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
, B
y C
son 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.