Auf dieser Site gibt es einige Fragen zum Ausgleichen von Klammern und zum Überprüfen, ob die Klammern ausgewogen sind. Ich schlage vor, es ist jetzt Zeit, diese ausgewogenen Klammern für etwas zu verwenden!
In Mathematik und Programmierung sind Klammern wie Blasen, die alles Innere von allem Äußeren isolieren, sodass alles, was drinnen ist, in Ruhe seine Sache tun kann und alles, was draußen ist, nur ein Objekt sieht. Eine Reihe von Klammern ist jedoch eindimensional, während Blasen gewöhnlich mindestens zweidimensional sind. Das bedeutet, dass sich Blasen frei bewegen können, solange sie sich nicht berühren oder sich zwischen der Innenseite und der Außenseite anderer Blasen kreuzen.
Herausforderung
Die Eingabe ist eine Zeichenfolge aus aufeinander abgestimmten Klammern eines einzelnen Typs, entweder rund ()
, quadratisch []
, geschweift {}
oder winklig <>
. Es liegt an Ihnen, welche Art von Programm Sie akzeptieren möchten, und ein Programm, das nur eine einzige Art von Klammern akzeptiert, wird akzeptiert. (Imaginärer Bonus, wenn Ihr Programm einen von ihnen verarbeiten kann, massive imaginäre Bonuspunkte, wenn es alle in derselben Eingabe verarbeiten kann.) Die Eingabe darf nichts zwischen den Klammern enthalten, obwohl abschließende Leerzeichen zulässig sind.
Bei der Ausgabe handelt es sich um alle möglichen Reorganisationen (in beliebiger Reihenfolge und einschließlich der ursprünglichen Eingabe) derjenigen Klammern, die dieselbe Blasenkonfiguration ohne zwei identische Zeichenfolgen ergeben. Das heißt, bei einer Eingabe von ()()
ist die Ausgabe auch gerecht ()()
, obwohl es technisch gesehen zwei Blasen sind, die Plätze tauschen könnten. Für den massiven imaginären Bonus führt eine Eingabe des {}[]()
Willens natürlich zu einer Ausgabe von 6 verschiedenen Elementen / Strings / Linien.
Zwei Blasenkonfigurationen sind "gleich", wenn Sie eine Blase in die andere verschieben können, ohne dass sich eine Blase von innen nach außen oder von außen nach innen kreuzt. Wenn Sie verschachtelte Klammern mit Bäumen vergleichen (jedes übereinstimmende Paar ist ein Knoten, und jedes übereinstimmende Paar innerhalb ist ein Unterknoten, und jedes übereinstimmende Paar innerhalb ist wieder ein Unterknoten usw.), werden die Unterknoten eines bestimmten Knotens sortiert Dann ist eine einzelne Konfiguration von Blasen ein Baum, in dem die Knoten ungeordnet sind.
Jedes vernünftige Ausgabeformat reicht aus, z. B. das Zurückgeben einer Liste von Zeichenfolgen oder einer Liste von Einzelzeichen oder einer einzelnen Zeichenfolge mit einer Art von Leerzeichen oder das Drucken in stdout
oder stderr
mit einer Form von sichtbarem Leerzeichen (meistens Zeilenvorschub oder Leerzeichen) dazwischen jede Neuorganisation.
Nachgestellte Leerzeichen für jede Reorganisation sowie nachgestellte und vorangestellte Zeilen / leere Listenelemente vor und nach der eigentlichen Ausgabe sind zulässig. Sie sollten in Ihrer Ausgabe die gleichen Klammern verwenden, die Sie in Ihrer Eingabe akzeptieren. Abgesehen von den hier angegebenen Klammern, Zeilenumbrüchen und Leerzeichen und dem von Ihnen verwendeten Trennzeichen sollte nichts gedruckt werden (einschließlich unsichtbarer / Null-Zeichen).
Die Punktzahl ist die Anzahl der Bytes im Code. Die niedrigste Anzahl für jede Sprache gewinnt. Sie können feststellen, ob Sie einen imaginären Bonus erhalten, entweder regulär oder massiv, aber dies hat keinen Einfluss auf Ihre Punktzahl. Tatsächliche Boni sind zu schwer auszugleichen.
Input-Output-Beispiele
Beispiel 1:
Eingang:
()(())
Ausgabe:
()(())
(())()
Beispiel 2:
Eingang:
(()())()()
Ausgabe:
(()())()()
()(()())()
()()(()())
Beispiel 3:
Eingang:
(()(()))()
Ausgabe:
((())())()
()((())())
(()(()))()
()(()(()))
((()))
in Beispiel 1 kommen? oder()()()
? Es scheint, als ob Ihnen für jede Eingabe Permutationen fehlen.Antworten:
CJam , 18 Bytes
Probieren Sie es online!
-2 dank Business Cat .
Erhält Eingaben als Zeichenfolge, die nur enthält
[]
. Gibt eine Liste mit Permutationen zurück (leere Listen sind die gleichen wie leere Zeichenfolgen in CJam, statt dass[]
Sie sie erhalten""
).quelle
[][]
nur für""
? - Sollte der Eingang in einem zusätzlichen Satz von enthalten sein[]
? Wenn ja, warum gibt es eine zusätzliche Menge von[]
(vielleicht?) Was ist die Ausgabe für das oben genannte Beispiel? In der Frage heißt es auch: "Sie sollten in Ihrer Ausgabe die gleichen Klammern verwenden, die Sie in Ihrer Eingabe akzeptieren. Abgesehen von den hier angegebenen Klammern, Zeilenumbrüchen und Leerzeichen und dem von Ihnen verwendeten Trennzeichen sollte nichts gedruckt werden." Ich bin mir nicht sicher, ob eine Mischung aus[]
und""
akzeptabel ist.[][]
ein zusätzliches Paar beifügen[]
. Für die anderen bin ich mir nicht sicher, ob sie ungültig sind._{{B}%e!}&
anstelle von_!!{{B}%e!}*
&
Kurzschluss oder so?&
Läuft den Block nur, wenn der andere Wert wahr istHaskell ,
227210208205 BytesProbieren Sie es online!
Dieser war hart!
Ein bisschen Golf gespielt
Zwei Bytes dank Laikoni gespart
Sparen Sie zwei Bytes dank Bruce Forte
Ich bin mir nicht sicher, ob das in jedem Fall funktioniert. Einige Erklärungen:
a!x
füge den Stringx
der letzten Liste von Strings hinzua
(a ist vom Typ[[String]]
)snd$foldl(\(a,r)x->if x=='('then(a+1,last$(r++[[]]):[r!x|a>0])else(a-1,last$r:[r!x|a>1])
verwendet die kürzere Bedingung , um die einfache Idee auszudrücken: Teilen Sie einen String auf root)(
s. ZB"(()(()))()"
gibt["()(())", ""]
.Wir müssen jeden Teil der Teilung verarbeiten, dann alle Zeichenfolgen sammeln und verbinden, um die richtige Ausgabe zu erhalten:
h
Verarbeitet eine Teileliste: Sie giltv
für den ersten Teil und kombiniert das Ergebnis mit dem Prozess der übrigen Teile.v
aggregiert die Ergebnisse für jede Permutation der Teile und entfernt die Duplikate.Um eine umfassendere Ansicht hinzuzufügen: Sie haben im Grunde einen Baum (keinen binären) mit leeren Knoten. Urlaub sind
()
. Sie müssen für jeden Knoten alle Permutationen der Zweige erzeugen, dürfen jedoch keinen Zweig von einem Knoten nehmen und auf einen anderen Knoten legen. Ich habe eine Art Tiefensuche durchgeführt.quelle
init a
.Python 2,
353350331 BytesErhält den String
()
als Eingabe und druckt das Ergebnis.Probieren Sie es hier aus!
Ich habe es vermieden,
itertools.permutations
mit Hilfe von Paolo die Antwort auf diese Frage zu verwenden .Vielen Dank an Business Cat für das Auffinden von 3 Bytes und an Mr. Xcoder für unglaubliche 19 Bytes!
Erläuterung
()
Paars in der Eingabezeichenfolge.()
Paar umgeben sind.quelle
print
und an Stellen wiei+1 if
(könntei+1if
). Auch an einer Stelle, die Sie habeny[0:i]
, können Sie die 0 weglassen.JavaScript (Firefox 30-57), 222 Byte
Nimmt
[]
Saiten. Erläuterung:quelle
Mathematica, 337 Bytes
Nicht um Code-Golf-Punkte zu bekommen, sondern um die Verwendung von
Permutations
undDistribute
in diesem Problem zu zeigen . Es kann jedoch bessere Ansätze geben.(
seq
: Sequenzalt
,: Alternativen)Nehmen Sie die Eingabe in geschweiften Klammern
{
und als Zeichenfolge}
. Ausgabe eines mehrzeiligen Strings.quelle