Diese Challenge wurde im Rahmen der LotM-Challenge im April 2018 sowie zum 2. Geburtstag von Brain-Flak veröffentlicht
Ich dachte darüber nach, wie man Brain-Flak-Programme am effizientesten codieren könnte. Da es nur 8 gültige Zeichen gibt, ist es naheliegend, jedes Zeichen einer 3-Bit-Sequenz zuzuordnen. Dies ist sicherlich sehr effektiv, aber es ist immer noch sehr redundant. Es gibt einige Funktionen von Brain-Flak-Code, die wir nutzen könnten, um die Codierung zu verkürzen.
Die Nullen, die alle durch 2 übereinstimmende Klammern dargestellt werden, fungieren tatsächlich als einzelne Informationseinheit anstatt als 2. Wenn wir jede Klammer durch ein einzelnes Byte-Zeichen ersetzen, würden die Codierungen viel kleiner, ohne dass Daten verloren gehen.
Dieser ist weniger offensichtlich, aber die abschließenden Bytes der Monaden sind auch redundant. Denken Sie, Sie könnten erraten, was die
'?'
Zeichen im folgenden Ausschnitt darstellen?{(({}?<>?<>?
Wenn wir davon ausgehen, dass die Eingabe ein gültiger Brain-Flak-Code ist, gibt es für jedes dieser Fragezeichen nur eine Option. Dies bedeutet, dass wir eindeutig ein enges Monadenzeichen verwenden können, um jede schließende Klammer darzustellen. Dies hat den zusätzlichen Vorteil, dass der Zeichensatz klein gehalten wird, was sehr hilfreich wäre, wenn wir eine Huffman-Codierung verwenden möchten. Da das enge Monadenzeichen mit großer Wahrscheinlichkeit das am häufigsten vorkommende Zeichen ist, könnte es durch ein einzelnes Bit dargestellt werden, was äußerst effizient ist.
Mit diesen beiden Tricks können wir Brain-Flak-Code mithilfe des folgenden Algorithmus komprimieren:
Ersetzen Sie jede schließende Klammer einer Monade durch
|
. Oder mit anderen Worten, ersetzen Sie jede schließende Klammer, der kein Eröffnungsspiel vorausgeht, durch einen Balken. So...(({})<(()()())>{})
würde werden
(({}|<(()()()||{}|
Ersetzen Sie jeden Nilad mit seiner schließenden Klammer. Daher verwenden übereinstimmende Klammern, in denen sich nichts befindet, die folgende Zuordnung:
() --> ) {} --> } [] --> ] <> --> >
Jetzt lautet unser letztes Beispiel:
((}|<()))||}|
Entfernen Sie nachfolgende
|
Zeichen. Da wir wissen, dass die Gesamtzahl der Balken der Gesamtzahl der({[<
Zeichen entsprechen sollte, können wir auf fehlende Balken am Ende schließen. Also ein Beispiel wie:({({})({}[()])})
würde werden
({(}|(}[)
Ihre Herausforderung für heute ist es, diesen Prozess umzukehren.
(){}[]<>|
Erweitern Sie eine Zeichenfolge aus komprimiertem Brain-Flak, die nur die Zeichen enthält , in den ursprünglichen Brain-Flak-Code. Sie können davon ausgehen, dass die Eingabe immer zu gültigem Brain-Flak erweitert wird. Dies bedeutet, dass kein Präfix der Eingabe mehr |
als ({[<
Zeichen enthält.
Die Eingabe enthält keine nachgestellten |
Zeichen. Diese müssen aus dem Kontext abgeleitet werden.
Wie üblich können Sie entweder ein vollständiges Programm oder eine Funktion einreichen, und Eingabe- / Ausgabeformate sind zulässig. Und da dies ein Code-Golf ist , wird Ihr Code durch die Länge des Quellcodes in Bytes bewertet. Je kleiner die Punktzahl, desto besser.
Testfälle
Hier sind einige Testfälle. Wenn Sie mehr möchten, können Sie mit diesem Python-Skript und dem Brain-Flak-Wiki , aus dem die meisten dieser Testfälle stammen , Ihre eigenen Testfälle generieren .
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}