Wir bezeichnen eine Parens-Gruppe als Open Paren (
, als Matching Close Paren )
und als alles, was sich in ihnen befindet.
Eine Parens-Gruppe oder Zeichenfolge wird als Klammerausgleich bezeichnet, wenn sie entweder nichts oder nur 2 Klammerausgleichs-Parens-Gruppen enthält.
Beispielsweise:
The string "(()())()" is parenthesly balanced
( )() Because it contains exactly 2 parenthesly balanced parens groups
()() The left one is parenthesly balanced because it contains 2 parenthesly balanced parens groups (balanced because they are empty). The right one is parenthesly balanced because it contains nothing.
Gleichfalls:
The string "(()(()))()" is not parenthesly balanced
( )() Because it contains a parens group that is not parenthesly balanced: the left one
()( ) The left one is not balanced because it contains a parens group that is not balanced: the right one
() The right one is not balanced because it only contains one balanced group.
Eine in Klammern gesetzte Zeichenfolge oder eine Parens-Gruppe sollte also entweder:
- Überhaupt nichts enthalten.
- Oder Sie enthalten nur und genau 2 in Klammern gesetzte Gruppen. Es sollte nichts anderes enthalten.
Aufgabe:
Ihre Aufgabe ist es, eine Funktion oder ein Programm zu schreiben, das prüft, ob eine bestimmte Zeichenfolge in Klammern steht oder nicht.
Eingang:
Die Eingabe erfolgt als Zeichenfolge oder Liste von Zeichen oder ähnlichem. Sie können davon ausgehen, dass die Zeichenfolge nur aus den Zeichen '('
und besteht ')'
. Sie können auch davon ausgehen, dass jedes offene Paren (
ein passendes enges Paren )
hat. Machen Sie sich also keine Gedanken über Zeichenfolgen wie "((("
oder ")("
oder "(())("
...
Hinweis: Wie bereits erwähnt durch @DigitalTrauma in seinem Kommentar unten, dann ist es in Ordnung , die subtitute ()
Combo durch andere Zeichen (wie <>
, []
, ...), wenn es zusätzliche Arbeit verursacht , wie in einigen Sprachen zu entkommen
Ausgabe:
Alles, was signalisiert, ob die Zeichenfolge in Klammern steht oder nicht (wahr oder falsch, 1 oder 0, ...). Bitte geben Sie in Ihrer Antwort an, welche Ergebnisse Ihre Funktion / Ihr Programm erwarten.
Beispiele:
"" => True
"()()" => True
"()(()())" => True
"(()(()(()())))(()())" => True
"(((((((()())())())())())())())()" => True
"()" => False
"()()()" => False
"(())()" => False
"()(()(())())" => False
"(()())(((((()())()))())())" => False
"()(()()()())" => False
"()(()(()())()())" => False
Die letzten beiden Beispiele haben wirklich einen Unterschied gemacht!
Viel Glück!
quelle
"(()())()"
würde dargestellt als[0, 0, 1, 0, 1, 1, 0, 1]
. Dies würde die Notwendigkeit beseitigen, die Eingabe in Zeichencode umzuwandeln und dann zu subtrahieren.Antworten:
Japt v2, 20 Bytes
Online testen!
Jeder hat die Herausforderung zunächst missverstanden, und obwohl jedes Klammerpaar eine gerade Anzahl von Unterpaaren enthalten musste, verlangt die Herausforderung tatsächlich 0 oder 2 Unterpaare. Hier ist meine überarbeitete Antwort mit der gleichen Technik wie zuvor.
Wir können die Herausforderung immer noch durch rekursives Ersetzen lösen. Die Sache ist, anstatt nur alle Vorkommen von zu entfernen
()()
, müssen wir sicherstellen, dass sich nichts anderes im selben Wrapper befindet als das()()
(mit anderen Worten, nein()()()()
oder so etwas). Wir können dies tun , indem rekursiv ersetzt(()())
mit()
.Das neue Problem besteht darin, dass die Eingabe selbst kein Paar äußerer Klammern enthält (da dies keine in Klammern gesetzte Zeichenfolge wäre), sodass wir sie in ein zusätzliches Paar einschließen müssen, um sie vollständig zu reduzieren. Schließlich ist das Endergebnis für ausgeglichene Zeichenfolgen jetzt
()
anstelle der leeren Zeichenfolge. Wir überprüfen daher die Gleichheit, anstatt nur das logische NICHT der Ausgabe zu verwenden.quelle
sed 4.2.2, 30
Probieren Sie es online aus .
Dies gibt einen Shell-Exit-Code von 1 für True und 0 für False zurück.
quelle
Perl 5 -lp,
2422 BytesProbieren Sie es online! Link enthält Testfälle. Bearbeiten: 2 Bytes dank @JoKing gespeichert. Erläuterung: Nur ein rekursiver regulärer Ausdruck. Die äußere Erfassungsgruppe stellt eine ausgeglichene Zeichenfolge dar,
<
gefolgt von einer optionalen ausgeglichenen Zeichenfolge, gefolgt von einer>
zweifachen. Beachten Sie, dass die meisten anderen Antworten()
s verwenden können, dies jedoch zwei zusätzliche Bytes kostet:Probieren Sie es online! Link enthält Testfälle.
quelle
<>
()
s verwenden, daher hielt ich es nicht für einen fairen Vergleich. Ich sehe jedoch, dass die APL-Antwort von @ ngn auch<>
s verwendet, sodass ich diese aktualisiert habe.6502 Maschinencode- Routine, 48 Bytes
Erwartet einen Zeiger auf eine Zeichenfolge in
$fb
/,$fc
die nur(
und enthalten soll)
. Löscht das C-Flag (Übertragen), wenn die Zeichenfolge "paranthesalanced" ist, und setzt es ansonsten (was eine typische Redewendung beim 6502 ist, setze Übertragen "on error"). Macht bei ungültiger Eingabe nichts Sinn.Obwohl der Algorithmus rekursiv ist, ruft er sich nicht selbst auf (was mehr Bytes erfordern und die Codeposition abhängig machen würde), sondern behält selbst eine Rekursionstiefe bei und verwendet "einfache" Verzweigung.
Kommentierte Demontage
Beispiel C64 Assembler Programm mit der Routine:
Online-Demo
Code in ca65- Syntax:
quelle
V ,
21, 20 BytesProbieren Sie es online! oder Überprüfen Sie alle Testfälle!
Hexdump:
quelle
Brachylog , 28 Bytes
Probieren Sie es online!
Erläuterung
quelle
C (gcc) 113 Bytes
Probieren Sie es online!
Erläuterung
Probieren Sie es online!
quelle
MATL ,
2625 BytesProbieren Sie es online!
Dank der Antwort von @ETHProductions für die Idee "replace (() ()) with ()" und des Fragekommentars von @JungHwan Min für die Idee, die Klammern als Binärziffern zu sehen.
Die Ausgabe ist ein leeres Array für Wahrhaftigkeit, eine positive Zahl für Falschgeld - was meines Erachtens in OPs Kommentar erlaubt ist: "Könnten Kategorien sein, dh Wahrheitswerte, um Wahrhaftigkeit zu signalisieren, und falsche Werte, um etwas anderes zu signalisieren." Wenn dies nicht der
n
Fall ist , können wir am Ende für +1 Byte hinzufügen , um 0 als Wahrheits- und 1 als Falschausgabe zu erhalten.Mit Kommentaren:
quelle
C # (.NET Core) ,
7871 BytesProbieren Sie es online!
quelle
Haskell ,
82-59BytesProbieren Sie es online!
Ich nehme an, es kann viel weiter golfen werden, da ich zum ersten Mal in Haskell Golf spiele. Daher sind Tricks und Kommentare mehr als willkommen.
BEARBEITEN - Danke an @nimi für das Speichern von 23 Bytes (mehr als 28% der ursprünglichen Einsendung :)
quelle
()
Umgebungy+1
. Da unbenannte Funktionen erlaubt sind, können Sie die fallen lassenf=
,r[0]
ist eine ordnungsgemäße Funktion. Setzen Sie den Basisfallr b[]
an das Ende und wechseln Sie zu einer Infix-Funktion (sprich#
), dann können Sie verwendenb#_=
. Sie können Ihren Algorithmus auch leicht ändern, indem Sie die Liste so erstellen, dass Sie Schritt für Schritt nach0
s und2
s suchen, anstatt sier
in einem Akkumulatorr(x:y:z) ... = x : r (...) a
mit Basistasche herumzutragenr b [] = b
. Führen Sie die Prüfung nach dem ersten Anruf durchr[0]
. Alles in allem 73 Bytes.foldl
(59 Bytes): Probieren Sie es online aus! .JavaScript (ES6), 63 Byte
Nimmt die Eingabe als Array von Zeichen. Gibt false zurück, wenn der Wert in Klammern angegeben ist, true , wenn der Wert nicht in Klammern angegeben ist.
Probieren Sie es online!
Kommentiert
Rekursiv, 54 Bytes
Die Verwendung von rekursiven Ersetzungen (wie in der Japt-Antwort von ETHproductions ) ist jedoch erheblich kürzer.
Übernimmt die Eingabe als Zeichenfolge. Gibt 1 für den Klammerausgleich zurück, 0 für den Klammerausgleich.
Probieren Sie es online!
Rekursiv, 46 Bytes
Dieser wirft einen Rekursionsfehler für nicht in Klammern ausgewogen:
Probieren Sie es online!
quelle
x[k]
anfangs undefiniert ist undx[k]++
geben würdeNaN
, wohingegen-~undefined
gibt1
.a[k]
enthält es anfangs ein Zeichen. Die gleiche Logik gilt jedoch auch für Zeichenfolgen: Wenn Sie den++
Operator auf diese anwenden , ergibt sichNaN
, aber bitweise Operatoren (z. B.~
) erzwingen, dass sie im0
Voraus erzwungen werden.Perl 6 ,
43 4137 BytesProbier es aus
Probier es aus
Probier es aus
Erweitert:
quelle
R , 71 Bytes
Probieren Sie es online!
Eine andere - längere - Lösung, aber interessant für den anderen Ansatz
R , 85 Bytes
Probieren Sie es online!
Erklärung:
Nehmen Sie die Eingabezeichenfolge und ersetzt:
wertet dann den resultierenden Ausdruck aus. Wenn es gleich Null ist, ist ausgeglichen, sonst nicht. Die Verwendung von
sum
ist nur erforderlich, um den leeren String-Fall zu behandeln, da seine Auswertung zurückgibtNULL
.z.B
quelle
f=function(s,r=sub('(()())','()',s,f=T))'if'(r==s,s==''|s=='()()',f(r))
Wolfram Language (Mathematica) , 65 Byte
Probieren Sie es online!
quelle
05AB1E ,
181613 BytesPort der Japt -Antwort von @ETHproductions , um den Testfall zu beheben
()(()()(()())(()()))
.-2 Bytes dank @Adnan .
Basierend auf diesem Kommentar von OP verwende ich jetzt
()
als Wahrheitswert und alles andere als Falschgeld. Wenn beide Werte statt nur einem konsistent sein müssen, wird stattdessen die alte 16-Byte-Antwort (…(ÿ)…(()∞„()©:®Q
) verwendet, die0
für wahrheitsgemäße und1
falsche Testfälle zurückgegeben wird.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung
(Alte 18-Byte-Antwort, die für den Testfall fehlgeschlagen ist
()(()()(()())(()()))
.):Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
quelle
„()∞õ:g_
.(()()()())
die Falschgeld enthalten sollen. Jede Klammergruppe sollte genau 0 oder 2 innere Gruppen enthalten.'(®')J
mit…(ÿ)
.ÿ
, dass es existiert, habe es aber noch nie benutzt, also habe ich es komplett vergessen.APL (Dyalog Classic) , 27 Byte
Probieren Sie es online!
quelle
Prolog , 46 Bytes
Probieren Sie es online! oder Überprüfen Sie alle Testfälle!
Verwendet Listen von
l
undr
als Eingabe, wird zB"()()"
getestet alsf([l,r,l,r]).
.Die ersten drei Zeilen sind die Grammatik gültiger Zeichenfolgen in der Syntax der Definite-Clause- Grammatik von Prolog .
a(A,B).
Gibt zurück,true
wannA
eine Liste ist, die der Grammatik folgt undB
leer ist. Somit nimmt die Hauptfunktionf
einigeX
und prüft, ob siea(X,[])
hält.quelle
Python 2 ,
7371 BytesProbieren Sie es online!
quelle
Brainfuck, 50 Bytes
Formatiert:
Erwartet eine Zeichenfolge mit
(
und)
ohne abschließende Zeilenumbrüche und gibt sie\x01
für wahr und\x00
falsch aus. (Aus Gründen der Lesbarkeit können Sie z. B. 48+
s vor dem Finale hinzufügen.
, um den Ausdruck zu ermöglichen,1
und0
stattdessen.)Probieren Sie es online aus
Auf diese Weise wird ein Stapel mit der Anzahl der Gruppen in jeder Tiefe verwaltet, wobei die Zeichen nach Parität unterschieden werden und nach jeder geschlossenen Klammer geprüft wird, ob die Anzahl der Gruppen in {0, 2} enthalten ist. Wenn die Bedingung nicht erfüllt ist, wird der Rest der Eingabe verbraucht und ein Flag gesetzt. prüft dann die Bedingung am Ende des Programms erneut.
Wenn wir den Eingabestream mit einem ungeraden Zeichen beenden dürfen, können wir die letzte Prüfung auslassen
<[--[>->]]
, um 10 Bytes zu sparen. (Wenn\n
es nicht gerade unpraktisch wäre, hätte ich möglicherweise diese Variante als Hauptantwort vorgeschlagen.)(Wir könnten auch einige Bytes einsparen, indem wir das Ausgabeformat in
\x00
true und non-\x00
for false ändern. Dies scheint in der Problembeschreibung (möglicherweise aus Versehen) zulässig zu sein, aber es wäre sowieso nicht sehr interessant, und ich bevorzuge es diese Änderung nicht vorzunehmen.)quelle
Python2,
95 bis94 BytesProbieren Sie es online!
f () transformiert den String in ein verschachteltes Tupel, das an g () übergeben wird.
g () navigiert rekursiv durch das Tupel und gibt False zurück, wenn ein Element nicht genau 0 oder 2 Kinder hat.
1 Byte durch Zeichenfolgenformatierung gespeichert.
quelle
Stax ,
1311 BytesFühren Sie es aus und debuggen Sie es
Ich habe zwei Bytes gespart, als mir klar wurde, dass die Eingaben zufällig implizit als Array-Literale ausgewertet werden können. Durch Entfernen der doppelten Anführungszeichen wird die Eingabe vereinfacht.
Die allgemeine Idee ist, die Eingabe als Array-Literal auszuwerten und die Elemente rekursiv zuzuordnen, um das parethesische Gleichgewicht zu überprüfen. Wenn die endgültige Zusicherung jemals fehlschlägt, erscheint ein Popup auf einem leeren Stapel. Wenn Sie in stax mit leeren Stapeln poppen, wird das Programm sofort beendet.
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
quelle
Java 10,
99969583 BytesPort meiner 05AB1E Antwort (kehrt also auch
()
als wahr und alles andere als falsch zurück).Probieren Sie es online aus.
Erläuterung:
return s;
kann sein,return"()".equals(s);
wenn ein tatsächliches boolesches Ergebnis erforderlich war.quelle
!s.contains("()()(")