Eine *()[]
geschweifte Klammer ist eine Zeichenfolge, die aus den Zeichen besteht, in denen geschweifte Klammern richtig übereinstimmen:
[brace-string] ::= [unit] || [unit] [brace-string]
[unit] ::= "" || "*" || "(" [brace-string] ")" || "[" [brace-string] "]"
Dies ist eine gültige geschweifte Klammer:
((())***[]**)****[(())*]*
Das sind aber nicht:
)(
**(**[*](**)
**([*)]**
Ihre Aufgabe ist es, ein Programm (oder eine Funktion) zu schreiben, das bei einer positiven Ganzzahl n
eine Zahl als Eingabe verwendet und alle gültigen geschweiften Klammern der Länge ausgibt (oder zurückgibt) n
.
Spezifikationen
- Sie können die Zeichenfolgen in beliebiger Reihenfolge ausgeben.
- Sie können als Liste oder als durch ein anderes Zeichen getrennte Zeichenfolge ausgeben.
- Ihr Programm muss 0 korrekt behandeln. Es gibt 1 möglichen Klammer-String der Länge 0, der der leere String ist
""
. - Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort - gemessen in Bytes .
Testfälle
0.
1. *
2. ** () []
3. *** ()* []* (*) [*] *() *[]
4. **** ()** []** (*)* [*]* (**) **() **[] *(*) *[*] (()) ()() ()[] ([]) [**] [()] [[]] []() [][] *()* *[]*
code-golf
balanced-string
Esolanging Fruit
quelle
quelle
Antworten:
Gelee, 29 Bytes
-3 Bytes dank @JonathanAllan
Bitte benachrichtigen Sie mich, wenn es Probleme / Fehler / Fehler oder Bytes gibt, die ich beseitigen kann!
Probieren Sie es online!
Die vorherigen Lösungen, die ich hatte:
Erklärung (Mein bester Versuch einer Beschreibung):
quelle
“[(*)]”ṗµḟ”*œṣ⁾()Fœṣ⁾[]FµÐLÐḟ
) speichernProlog, 69 Bytes
Eine der interessantesten Eigenschaften von Prolog ist, dass es in vielen Fällen in der Lage ist, ein Programm rückwärts auszuführen. Anstatt beispielsweise zu testen, ob etwas wahr ist, können Sie alle Lösungen generieren, für die es wahr ist, und statt die Länge einer Zeichenfolge zu überprüfen, können Sie alle Zeichenfolgen mit einer bestimmten Länge generieren. (Eine weitere nette Eigenschaft von Prolog ist, dass nach dem Ende jeder Prädikatdefinition Leerzeichen erforderlich sind und eine neue Zeile so billig wie ein Leerzeichen eingefügt werden kann; daher sind auch Golfprogramme oft ziemlich lesbar.)
Das Obige definiert ein Prädikat (das Äquivalent einer Funktion),
b
das prüft, ob eine Zeichenfolge eine bestimmte Länge hat und eine "Klammerzeichenfolge" ist, wie in der Frage definiert. Insbesondere geschieht dies über die Grammatik- / Regex- / Mustervergleichsunterstützung von Prolog, die einen netten, kurzen Zucker für die Definition dieser Art von Ausdruck liefert (anscheinend ist dies Standard / portabel, aber ich war mir dessen nicht bewusst, als ich die Antwort ursprünglich schrieb, und daher Angenommen, die Antwort würde nur für eine Prolog-Implementierung funktionieren, anscheinend jedoch für jede Implementierung, die den Standards entspricht. Das Programm kann ziemlich direkt ins Englische übersetzt werden; In den ersten beiden Zeilen steht "an s ist eine leere Zeichenfolge oder ein e gefolgt von einem s ; ein eist ein Sternchen oder ein s in Klammern oder ein s in eckigen Klammern. "Die dritte Zeile kann interpretiert werden als" Das b von N kann A sein, wenn A eine Liste mit der Länge N ist und A ein s gefolgt von einer Null ist Zeichenfolge. "Ich habe eine gewisse Sorgfalt zu schreiben
s
(und damitb
) , so dass sie in genau einer Art und Weise jeweils „Klammer Zeichenfolge“ entsprechen (das ist der Grund , dass beides
unde
existieren müssen, anstatt sie in ein Prädikat Gruppierung). Dies macht sie beide vollständig umkehrbar; Auf diese Weiseb
können alle "Klammerzeichenfolgen" einer bestimmten Länge generiert werden. Außerdem kann geprüft werden, ob eine Zeichenfolge eine Klammerzeichenfolge einer bestimmten Länge ist. Sie kann auch in dritter Richtung verwendet werden, um die Länge einer Klammer zu ermitteln string, aber das ist mit ziemlicher Sicherheit die am wenigsten nützliche Arbeitsweise). Die Implementierung ist rekursiv, z. B. um ein s zu generieren, generiert der Code alle möglichen e s, die nicht länger als die erforderliche Länge der Ausgabe sind, und hängt alle möglichen s ans, die in den verbleibenden Raum zu ihnen passen; Da ich die Länge des Arguments im Voraus festgelegt habe (innerhalb von b ), weiß die Prolog-Engine, dass keine Ausgabe generiert werden kann, die länger als die angegebene Länge ist, sodass die Rekursion beendet werden kann.Hier ist ein Beispiel des laufenden Programms:
quelle
length
und inappend
beiden Richtungen ist ein grundlegender Teil der Sprache, und Benutzerfunktionen tun dies oftmals auch.length(A,N)
; WennN
gegeben ist undA
nicht (was passiert, wenn das Prädikat auf die im Programm angeforderte Weise verwendet wird),length
wird eine ListeA
mitN
unbekannten Elementen erstellt. Mit messen die Länge einer Liste ist wahrscheinlich häufiger verwendet (obwohl mit ihm „rückwärts“ in Prolog - Programmierung ziemlich üblich ist). Die meisten Prädikate funktionieren im Endeffekt auf die gleiche Weise (der einzige Grund, warum sie dies nicht tun, ist, dass der Versuch, sie umzukehren, eine Endlosschleife erzeugt, was ziemlich häufig vorkommt).length
-->
und DCGs sind im Allgemeinen Standard-ISO-Prolog .Haskell,
10194 Bytes7 Bytes von Zgarb gespeichert!
Fast unkompliziert, der Definition folgend, aber mit dem
""
Fall verschoben.Verwenden:
(Die zweite Berechnung dauert auf einer langsamen Maschine weniger als eine Sekunde.)
Ich möchte auch das Ergebnis eines anderen Ansatzes mitteilen, den ich mir ausgedacht habe, als ich über die Generierung von Funktionen nachgedacht habe. Es definiert eine Liste
b
von Listen mit Zeichenfolgen,b!!n
die alle geschweiften Zeichenfolgen der Länge enthaltenn
. Ebensou!!n
enthält alle Atome der Größen-1
. Eine nette Sache ist, dass der Code keine Zahlen verwendet. Es ist nicht vollständig golfen:u
undi
könnte inline sein, und es verpasst sicherlich ein paar andere Golfmöglichkeiten. Leider sieht es nicht so aus, als ob es kürzer als die erste Version sein könnte, aber es wirdlength $ b !! 10
noch schneller berechnet .quelle
b$n-k
und zwei Bytes speichernb$n-2
. Auch in der letzten Zeile können Sie tuna:b<-["()","[]"]
und zurückkehrena:s++b
.["()","[]"]
, konnte aber nicht sehen, wie ich die Codegröße damit verbessern kann. Vielen Dank!Mathematica, 116 Bytes
Erläuterung
Suchen Sie die Zeichen der Zeichenfolge
"*([)]"
und geben Sie dieList
{"*", "(", "[", ")", "]"}
.Finden Sie die Tupel der obigen Liste mit Länge
n
.Unbenannte Boolesche Funktion, um festzustellen, ob das Tupel ausgeglichen ist:
Löschen Sie alle
"*"
in der Eingabe.Löschen Sie wiederholt alle aufeinander folgenden Vorkommen von
"("
und")"
oder"["
und,"]"
bis sich die Eingabe nicht mehr ändert.Überprüfen Sie, ob das Ergebnis leer ist
List
.Suchen Sie die Tupel, die
True
bei Anwendung der Booleschen Funktion angegeben werden.Wandle jedes
List
Zeichen inString
s um.quelle
{x=a___,"(",")",y=b___}|{x,"[","]",y}
scheint zu funktionieren.Python 2, 128 Bytes
Schrauben Sie rekursive reguläre Ausdrücke - wir verwenden Pythons Parser! Um zu überprüfen, ob es sich beispielsweise
*(**[])*
um eine geschweifte Klammer handelt, gehen Sie wie folgt vor:Machen Sie einen String wie
"*", (0,"*","*", [0,0] ,0) ,"*"
, wo jedes zweites Zeichen von vier ein Zeichen aus den Klammer-Strings ist, und die restlichen Zeichen sind Leim dies ein potentieller Python Ausdruck zu machen.eval
es.Wenn dies keinen Fehler auslöst, drucken Sie
s[1::4]
(die Klammerzeichen).Die Klebstoff - Zeichen werden gepflückt , so dass die Zeichenfolge ich mache , ist ein gültiger Python - Ausdruck , wenn und nur wenn jedes zweites Zeichen aus vier Ausbeuten ein gültiges Klammer-string nehmen.
quelle
PHP, 149 Bytes
Verwendet die gute alte Methode alle möglichen und dann Filter zu generieren. Verwenden Sie wie:
quelle
Python, 134 Bytes
repl.it
Unbenannte Funktion, die eine Liste gültiger Längenzeichenfolgen zurückgibt
n
.Formulare alle Längen
n
Tupel der Charaktere*()[]
, so dass sie in Strings verbindet mitmap(''.join,...)
und Filter für diejenigen , die Klammern durch das Entfernen der „Paare“ ausgeglichen hat"*"
,"()"
und"[]"
wiederumn
Zeiten und überprüfen, ob das Ergebnis ist eine leere Zeichenfolge (n
Zeiten sind übertrieben, vor allem für"*"
aber ist Golfspieler).quelle
Netzhaut , 78 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online!
Erläuterung
Ich generiere alle möglichen Zeichenfolgen der Länge 5 und filtere dann die ungültigen heraus.
Dies wandelt die Eingabe in eine unäre um und verwendet sie
1
als Ziffer.Dies ersetzt wiederholt (
+
) das erste (1
) in jeder Zeile (%
) in der Weise, dass fünf Kopien der Zeile erstellt werden, eine für jedes mögliche Zeichen. Dazu werden die Präfix- und Suffix-Ersetzungen verwendet$`
und$'
der Rest jeder Zeile erstellt.Diese Schleife stoppt, wenn keine Einsen mehr zu ersetzen sind. Zu diesem Zeitpunkt haben wir alle möglichen Längenketten
N
, eine in jeder Zeile.Diese beiden Stufen werden für jede Zeile separat ausgeführt (
%
). Die erste Stufe dupliziert einfach die Zeile mit einem;
, um die beiden Kopien zu trennen.Die zweite Stufe ist ein andere Schleife (
+
), die immer wieder entfernt[]
,()
oder*
von der ersten Kopie des Strings, oder entfernt ein Semikolon am Anfang der Leitung (was nur möglich ist , nachdem die Saite vollständig verschwunden ist ).Gültige Zeichenfolgen sind Zeichenfolgen, vor denen kein Semikolon mehr angezeigt wird. Wir verwerfen daher einfach alle Zeilen (
A
), die ein Semikolon enthalten.quelle
Python 3.5, 146 Bytes
Sehr lang im Vergleich zu anderen Antworten, aber die kürzeste, die ich derzeit finden konnte. Sie hat die Form einer anonymen Lambda-Funktion und muss daher im Format aufgerufen werden
print(<Function Name>(<Integer>))
Gibt einen Python Satz von ungeordneten Strings , die alle möglichen spangen Saiten der Eingabelänge.
Wenn die obige Funktion beispielsweise benannt wird
G
, führt das AufrufenG(3)
zu der folgenden Ausgabe:Probieren Sie es online! (Ideone)
Wenn jedoch, wie ich, Sie die Dinge zu vereinfachen mit Einbauten nicht wirklich ein Fan von sind, dann hier ist meine eigene ursprüngliche Antwort nicht verwendet keine externen Bibliotheken Permutationen zu finden, und zur Zeit auf einem sattes steht
288237 Bytes :Wie die konkurrierende Antwort hat auch diese die Form einer Lambda-Funktion und muss daher auch im Format aufgerufen werden
print(<Function Name>(<Integer>))
Und gibt eine Python- Liste mit unsortierten Zeichenfolgen aus, die alle geschweiften Zeichenfolgen der eingegebenen Länge darstellen. Wenn beispielsweise das Lambda als aufgerufen
G(3)
würde, wäre diesmal die Ausgabe wie folgt:Auch dies ist man auch viel schneller als meine andere Antwort, in der Lage , alle Klammer-Strings der Länge zu finden
11
in etwa 115 Sekunden , die die Länge10
in etwa 19 Sekunden die der Länge,9
in etwa 4 Sekunden , und das die Länge8
in Auf meinem Computer dauert die Eingabe etwa 0,73 Sekunden , während meine konkurrierende Antwort bei einer Eingabe von deutlich länger als 115 Sekunden dauert6
.Probieren Sie es online! (Ideone)
quelle
05AB1E, 23 Bytes
Einige dieser Funktionen wurden möglicherweise implementiert, nachdem die Frage gestellt wurde. Anregungen sind willkommen!
Probieren Sie es online!
Wie?
quelle
*
auch im Entfernungs-Array sein? Und könnte derõQ
Scheck durch so etwas wie NICHT ersetzt werden?'*м„()„[]‚õ:
vs„()„[]‚'*«õ:
(nicht getestet), da kein Befehl zum Verketten von 3 Werten AFAIK vorhanden ist. Der zweite wird nicht funktionieren, da es kein NOT gibt, das so auf einer Saite funktioniert, AFAIK. (Wo AFAIK "soweit ich weiß" darstellt)