Bei einer korrekt in Klammern gesetzten Zeichenfolge als Eingabe wird eine Liste aller nicht leeren Teilzeichenfolgen in übereinstimmenden Klammern (oder außerhalb aller Klammern) ausgegeben, wobei geschachtelte Klammern entfernt werden. Jede Teilzeichenfolge sollte die Folge von Zeichen in genau den gleichen Klammern sein. Teilzeichenfolgen sollten in der Reihenfolge der Tiefe aufgelistet werden, und Teilzeichenfolgen derselben Tiefe sollten in der Reihenfolge aufgelistet werden, in der sie in der Zeichenfolge vorkommen. Angenommen, die Eingabe ist immer korrekt in Klammern gesetzt.
Sie können davon ausgehen, dass die Eingabe nur ASCII-Kleinbuchstaben und Klammern enthält.
Ihre Antwort sollte eine Funktion sein, die bei Angabe einer Zeichenfolge eine Liste von Zeichenfolgen zurückgibt.
Beispiele:
'a(b)c(d)e' -> ['ace', 'b', 'd']
'a(b(c)d)e' -> ['ae', 'bd', 'c']
'a((((b))))' -> ['a', 'b']
'a()b' -> ['ab']
'' -> []
'a' -> ['a']
'(((a(b)c(d)e)f)g)h' -> ['h', 'g', 'f', 'ace', 'b', 'd']
'ab(c(((d)ef()g)h()(i)j)kl)()' -> ['ab', 'ckl', 'hj', 'efg', 'i', 'd']
Wenigste Bytes gewinnt.
quelle
'i'
und'd'
in der richtigen Reihenfolge im letzten Testfall?i
ist weniger tief verschachtelt alsd
.Antworten:
JavaScript ES6, 91
93 104 133 148Edit2 2 Bytes gespeichert dank user81655
Bearbeiten Sie mit mehr Zeichenfolgen und weniger Arrays
Testen Sie das folgende Snippet in einem EcmaScript 6-kompatiblen Browser
quelle
c=>l+=c<')'||-(o[l]=(o[l]||'')+c,c<'a'),
.Julia,
1178683 BytesEs ist eine Regex-Lösung.
Ungolfed:
r"(\(((?>\w|(?1))*)\))(.*)"
ist eine rekursive ((?1)
rekursive Gruppe 1) Regex, die den ersten ausgeglichenen Klammern (die keine unsymmetrischen / umgekehrten Klammern enthalten) entspricht, wobei die zweite Gruppe alles in den Klammern enthält (ohne die Klammern selbst) und die dritte Gruppe enthält alles nach den Klammern (bis zum Ende der Zeichenkette).replace(v,r"...",s"\g<3> \g<2>")
Verschiebt dann die zweite Gruppe an das Ende der Zeichenfolge (nach einem Leerzeichen, um als Begrenzer zu fungieren), wobei die entsprechenden Klammern entfernt werden. Durch Iterieren bis v == w wird sichergestellt, dass das Ersetzen wiederholt wird, bis keine Klammern mehr vorhanden sind. Da Übereinstimmungen an das Ende verschoben werden und die nächste Übereinstimmung für die erste Klammer gilt, ist das Ergebnis die Zeichenfolge, die in der Reihenfolge der Tiefe aufgeschlüsselt ist.Dann
split
kehrt alle der Nicht-Leerzeichen Komponenten der String in der Form einer Anordnung von Zeichenketten (die keine Leerzeichen haben).Beachten Sie, dass dies
w=""
im ungolfed-Code verwendet wird, um sicherzustellen, dass die while-Schleife mindestens einmal ausgeführt wird (außer natürlich, wenn die Eingabezeichenfolge leer ist) und in der golfed-Form nicht benötigt wird.Vielen Dank an Martin Büttner für die Unterstützung beim Sparen von 3 Bytes.
quelle
\w
anstelle von verwenden[^()]
.Python, 147 Bytes
Unit-Tests:
Ich mag dieses Rätsel. das ist sehr süß!
quelle
Pyth, 32 Bytes
Testsuite
Locker basierend auf @ Quuxplusones Ansatz. Erstellt durch Leerzeichen getrennte Listen der Zeichen in jeder Tiefe, teilt sie dann auf und filtert die leeren Gruppen heraus. Die Arbeitsliste wird gedreht, um die aktuelle Tiefenliste immer im Vordergrund zu haben.
quelle
Retina ,
4441 BytesLaufen Sie mit der
-s
Flagge. Beachten Sie das Leerzeichen am Ende der letzten Zeile.Ich habe diese Lösung unabhängig von Glen O entwickelt, aber sie ist identisch. Die Idee ist, das erste Klammernpaar abzugleichen, es zu entfernen und seinen Inhalt am Ende der Ausgabe einzufügen (wiederholt). Aufgrund der fehlenden Rekursion von .NET in regulären Ausdrücken musste ich Bilanzgruppen verwenden, die vier Bytes länger sind.
Wenn Sie den ersten regulären Ausdruck nicht verstehen, verweisen wir Sie auf meine SO-Antwort zum Thema Bilanzkreise . Da die Eingabe garantiert in Klammern steht, können wir zwei Bytes einsparen, indem wir statt
)
mit mit übereinstimmen . Dann passen wir einfach den Rest der Zeichenfolge an . Schreibt zuerst den Rest der Zeichenfolge zurück (wobei sowohl die Klammern als auch deren Inhalt weggelassen werden) und dann den Inhalt der Klammern nach einem Leerzeichen. Das weist Retina an, diesen Schritt zu wiederholen, bis sich die Zeichenfolge nicht mehr ändert (was erst geschieht, wenn alle Klammern entfernt wurden)..
\)
(.*)
$4 $1
+`
Leere Klammern führen zu zwei aufeinanderfolgenden Leerzeichen. Schließlich teilen wir die gesamte Zeichenfolge in Leerzeichen auf (
S`
aktiviert den Teilungsmodus und die Regex ist ein einzelnes Leerzeichen). Die_
Option weist Retina an, leere Teile der Teilung wegzulassen, sodass die leeren Ergebnisse nicht in die Ausgabe einbezogen werden.quelle
Common Lisp, 160
Dies könnten vier Bytes weniger sein, wenn die Konvertierung der Groß- / Kleinschreibung nicht erforderlich wäre. Die Idee ist, jeder Seite der Eingabezeichenfolge eine linke und eine rechte Klammer hinzuzufügen, sie als Liste zu behandeln, die Elemente der obersten Ebene der Liste in eine Zeichenfolge zu schreiben und die Unterlisten dann auf die gleiche Weise zu verarbeiten.
quelle
Haskell,
114112111 BytesAnwendungsbeispiel:
g "ab(c(((d)ef()g)h()(i)j)kl)()"
->["ab","ckl","hj","efg","i","d"]
.Ich gehe die Eingabezeichenfolge rückwärts durch. Die Zwischendatenstruktur ist eine Liste von Zeichenfolgen. Die äußere Liste ist pro Ebene und die innere Liste ist pro Gruppe innerhalb einer Ebene, z. B.
[["ab"],["ckl"],["hj"],["efg","i"],["d"]]
(Hinweis: Die reale Liste enthält viele leere Zeichenfolgen dazwischen). Alles beginnt mit einer Anzahl von leeren Strings, die der Länge der Eingabe entsprechen - mehr als genug, aber leere Listen werden trotzdem herausgefiltert. Die äußeren Listen drehen sich entweder um(
/)
oder fügen dem vorderen Element das Zeichen hinzu.)
startet auch eine neue Gruppe.Bearbeiten: @Zgarb hat ein Byte zum Speichern gefunden.
quelle
Sed, 90 Bytes
Verwendet erweiterte reguläre Ausdrücke (
-r
Flag) mit einem Anteil von +1 Byte. Dies verwendet auch eine GNU-Erweiterung (dasM
Flag ims
Befehl).Beispielnutzung:
Erläuterung: Da sed keine rekursiven regulären Ausdrücke unterstützt, ist manuelle Arbeit erforderlich. Der Ausdruck ist in mehrere Zeilen aufgeteilt, die jeweils eine Verschachtelungstiefe darstellen. Die einzelnen Ausdrücke in derselben Tiefe (und damit in derselben Zeile) werden durch ein getrennt
_
. Das Skript arbeitet die Eingabezeichenfolge nacheinander in Klammern ab. Die verbleibende Eingabe bleibt immer am Ende der Zeile, die der aktuellen Verschachtelungsebene entspricht.quelle
Python, 161 Bytes
Folgendes habe ich mir ausgedacht: Eine einzeilige funktionale Python-Lösung:
Diese Herausforderung wurde von https://github.com/samcoppini/Definition-book inspiriert , das eine lange Zeichenfolge mit in Klammern definierten Wörtern ausgibt. Ich wollte Code schreiben, der mir jeden Satz mit entfernten Klammern gibt. Die funktionale Lösung ist zu langsam, um auf langen Saiten wirksam zu sein, aber Imperativlösungen (wie die Lösung von @ Quuxplusone) sind viel schneller.
quelle