Normale Klammern ( ()
, []
, <>
und {}
) sind schön und eindeutig sein , aber jemand dachte , dass es eine gute Idee wäre , nicht Klammerzeichen wie Klammern zu verwenden. Diese Zeichen |
und "
sind nicht eindeutig. Zum Beispiel tut
""""
entsprechen
(())
oder
()()
Es ist unmöglich zu sagen.
Interessant wird es zum Beispiel, wenn Sie Typen von mehrdeutigen Klammern mischen
"|""||""|"
Könnte eine der folgenden sein
([(([]))]),([()[]()]),([()][()])
Aufgabe
Ihre Aufgabe ist es, eine Zeichenfolge aus mehrdeutigen Zeichen zu erstellen und alle möglichen ausgewogenen Zeichenfolgen auszugeben, die der Autor beabsichtigt haben könnte.
Genauer gesagt, Sie geben alle ausgewogenen Saiten aus, die |
durch entweder [
oder ]
und "
durch entweder (
oder ersetzt werden können )
. Sie sollten keine symmetrische Zeichenfolge zweimal ausgeben.
IO
Als Eingabe sollte ein String aus |
und verwendet werden "
. Wenn Sie zwei verschiedene Zeichen als |
und "
als Ersatz auswählen möchten, können Sie dies tun. Sie sollten einen Container mit ausgeglichenen Zeichenfolgen ausgeben. Sie können wählen, ersetzen []
und ()
in der Ausgabe mit irgendwelchen anderen beiden Bügelpaare ( ()
, []
, <>
oder {}
) Sie möchten. Ihr Ausgabeformat sollte über mehrere Läufe hinweg konsistent sein.
Wertung
Dies ist Codegolf, daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.
Testfälle
"" -> ["()"]
"|"| -> []
||| -> []
"""" -> ["(())","()()"]
""|| -> ["()[]"]
"|"||"|" -> ["([([])])"]
"|""||""|" -> ["([(([]))])","([()[]()])","([()][()])"]
quelle
Antworten:
Python 2 , 135 Bytes
Probieren Sie es online!
Erwartet Eingaben wie
2002
anstelle von"||"
und in Anführungszeichen.Durchläuft alle 2 N möglichen Zuweisungen von "open" und "close" für die Zeichenfolge und erstellt Zeichenfolgen
c
wie:Wenn
eval
diese Zeichenfolge eine Ausnahme auslöst, ist die Übereinstimmung nicht gegeben. Wenn nicht, drucken wirc[::2]
und geben:quelle
Netzhaut ,
595655 BytesProbieren Sie es online! Leider übertrifft das Testen von zwei Sätzen übereinstimmender Klammern die Leistung eines einzelnen .NET-Regex, sodass 15 Byte für die manuelle Prüfung eingespart werden. Bearbeiten:
34 Bytes dank @ H.PWiz gespeichert. Erläuterung:Suchen Sie a
"
und machen Sie zwei Kopien der Zeile, eine mit a<
und eine mit a>
. Führen Sie dies nacheinander durch"
, sodass sich"
die Anzahl der Zeilen jeweils verdoppelt.Ähnlich mit
'
,{
und}
. Ersetzen Sie dann so lange, bis alle"
s und'
s auf allen Kopien ersetzt wurden.Machen Sie ein Duplikat der Klammern, getrennt durch ein
_
.Löschen Sie im Duplikat wiederholt übereinstimmende Klammern, bis keine mehr vorhanden sind. Löschen Sie in diesem Fall auch die Klammern
_
.Löschen Sie alle Zeilen mit einem
_
.Retina ,
747170 BytesProbieren Sie es online! Erläuterung: Die ersten beiden Stufen sind wie oben. In der dritten Stufe wird das Ergebnis des Abgleichs zweier Sätze übereinstimmender Klammern direkt gedruckt. Hierbei werden die Bilanzkreise von .NET verwendet. In jeder Phase des Spiels versucht der Regex, einem Charakter zu entsprechen, sucht dann nach einem Paar übereinstimmender Klammern und prüft, ob die Oberseite des Stapels mit der offenen Klammer übereinstimmt. Wenn dies möglich ist, wird die Klammer ausgeglichen, und die offene Klammer wird vom Stapel genommen. Ansonsten wird davon ausgegangen, dass wir uns an einer offenen Klammer befinden, die auf den Stapel geschoben werden muss. Wenn diese Annahmen nicht zutreffen, ist der Stapel am Ende nicht leer und die Übereinstimmung schlägt fehl.
Alternativer Ansatz, auch
7471 Bytes:Hier schauen wir voraus entweder
<
...>
oder{
...}
, dann schauen Sie hinter die schieben Schließbügel auf den Stapel. Andernfalls müssen wir die zuvor erfasste schließende Klammer abgleichen und platzieren. In dieser Version schafft es der Regex möglicherweise nicht einmal bis zum Ende der Zeichenfolge, aber einige Zeichenfolgen, wie z. B.<<<>
, rutschen durch das Netz, wenn wir nicht nach einem leeren Stapel suchen.quelle
|
in der Eingabe ändernSchale , 19 Bytes
Probieren Sie es online! Verwendet die Zeichen
ds
in der Eingabe sowie die entsprechenden Klammerpaarede
undst
in der Ausgabe.Erläuterung
Die Idee ist, alle möglichen Klammern der Eingabe zu generieren und diejenigen zu behalten, die sich auf die leere Zeichenfolge reduzieren, wenn wir wiederholt benachbarte Klammern entfernen. Dies
¨÷₂¨
ist eine komprimierte Zeichenfolge, in"dest"
die expandiert wird und die ausgewählt wurde, weil sie eine kurze komprimierte Form hat und aus Zeichenpaaren mit benachbarten Codepunkten besteht. Somit entspricht das Programm dem Folgenden.quelle
Perl,
565553 BytesEnthält
+1
fürn
verwendet
[
für[]
und{
für{}
Generiert alle 2 ^ N-Möglichkeiten und
eval
prüft dann mithilfe von Perl , ob ein String wie '+ [+ {}]' ein gültiger Code ist. Wenn dies der+
Fall ist, wird das Ergebnis entfernt und gedrucktquelle
APL (Dyalog Classic) ,
5553 BytesProbieren Sie es online!
quelle
Sauber ,
203186179 BytesProbieren Sie es online!
Verwendet nur Mustererkennung und Verstehen.
quelle
Perl, 56 Bytes
Beinhaltet
+
fürn
Verwendet die Eingabe
[
für die Ausgabe[
oder]
Verwendet Input
{
für Output{
oder}
Verwendet einen erweiterten Perl-Regex, um die Klammern anzupassen und die während der Rückverfolgung getroffenen Entscheidungen zu verfolgen. Dies kann sehr viel effizienter sein, als alle 2 ^ N Kandidaten zu generieren, da bereits viele unmögliche Zuweisungen auf halbem Weg durch die Eingabezeichenfolge zurückgewiesen werden
quelle
Kotlin ,
240236234 BytesVerschönert
Prüfung
Bearbeitungen
true
->1>0
und== 0
->< 1
quelle
C (gcc) , 315 Bytes
Probieren Sie es online!
C (gcc) , 334 Bytes (alte Version)
Probieren Sie es online!
Erklärung (alte Version)
Probieren Sie es online!
quelle
*s++
an einigen Stellen verwende.char S[n],*s=S
ist noch kürzer alschars*s=calloc(n,1)