Stack Cats ist eine umkehrbare, stapelbasierte Sprache. Seine reversible Natur sorgt für etwas seltsame Schleifen. Bei dieser Herausforderung geht es um die bedingte Schleife (...)
. Wenn diese Schleifen auf bestimmte Weise verschachtelt sind, kann der Code transformiert werden, um die Verschachtelungstiefe zu verringern. Hier sind die Regeln (wo A
und B
für einen beliebigen Ausschnitt stehen):
- Wenn eine Schleife mit einer anderen beginnt, können wir die innere Schleife nach vorne extrahieren:
((A)B)
wird(A)(B)
. - Wenn eine Schleife mit einer anderen Schleife endet, können wir die innere Schleife bis zum Ende extrahieren:
(B(A))
wird(B)(A)
. - Leere Loops
()
können vollständig aus dem Programm entfernt werden. Als Folgerung (in Verbindung mit den anderen Regeln)((A))
ist äquivalent zu(A)
.
Die einzige verschachtelten Schleifen , die von der Form bleiben (A(B)C)
, wo A
, B
und C
nicht leer ist .
Die Herausforderung
Sie erhalten ein gültiges Stack Cats-Programm. Ihre Aufgabe ist es, mithilfe der obigen Transformationen die Verschachtelungsebene von Schleifen so weit wie möglich zu verringern, ohne leere Schleifen zu hinterlassen.
Ein gültiges Stack Cats Programm ...
- ... besteht nur aus den Zeichen
()/\<>[]{}!"*+-:=ITX^_|
. - ... hat Spiegelsymmetrie (zB
\(]{}!{}[)/
ist ein gültiges Programm, ist es aber/|/
nicht). - ... hat richtig abgestimmt und verschachtelt
()
und{}
([]
,<>
und\/
müssen nicht unbedingt wie üblich zusammengepaßt werden, obwohl sie paarweise auf Grund der Spiegelsymmetrie Anforderung erscheinen werden).
Sie können entweder eine Zeichenfolge oder eine Liste von Zeichen als Eingabe verwenden, die Ausgabe muss jedoch im gleichen Format erfolgen.
Sie können ein Programm oder eine Funktion schreiben und eine unserer Standardmethoden zum Empfangen von Eingaben und zum Bereitstellen von Ausgaben verwenden. Beachten Sie, dass diese Lücken standardmäßig verboten sind.
Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort - gemessen in Bytes .
Testfälle
Testfälle sind jeweils zwei Zeilen (Eingabe und Ausgabe), die durch Leerzeilen getrennt sind. Beachten Sie, dass eine Ausgabe leer ist. Sie müssen auch die leere Eingabe unterstützen (was zu einer leeren Ausgabe führen sollte).
(((=+|+=)))
(=+|+=)
({(=+|+=)})
({(=+|+=)})
((\)/)I(\(/))
(\)(/)I(\)(/)
(()()(())()())
((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)
(...)
Schleifen vom Typ gültig .
\^/
im letzten Testfall in Klammern?
(<|>((X((T)))[_]))
und extrahiert haben (([_](((T))X))<|>)
.
((A)B(C))
wird es (A)(B)(C)
sowohl nach Regel 1 als auch nach Regel 2 : ((A)B(C))
→ (A)(B(C))
(Regel 1) → (A)(B)(C)
(Regel 2).
()
, sodass eine Eingabe{{A}B}
unverändert bleibt und auch nicht extrahiert wird{A}{B}
.