Sie müssen ein Programm oder eine Funktion schreiben, die eine Reihe von Klammern verwendet und ausgibt, ob diese Zeichenfolge vollständig übereinstimmt oder nicht. Ihr Programm sollte einen echten oder falschen Wert ausgeben , und IO kann in jedem vernünftigen Format vorliegen .
Regeln und Definitionen:
Für die Zwecke dieser Herausforderung ist eine „Klammer“ eines dieser Zeichen:
()[]{}<>
.Ein Klammerpaar wird als "übereinstimmend" betrachtet, wenn die öffnende und schließende Klammer in der richtigen Reihenfolge sind und keine Zeichen enthalten, z
() []{}
Oder wenn jedes Unterelement in ihm auch übereinstimmt.
[()()()()] {<[]>} (()())
Unterelemente können auch mehrere Ebenen tief verschachtelt sein.
[(){<><>[()]}<>()] <[{((()))}]>
Eine Zeichenfolge wird genau dann als "vollständig zugeordnet" betrachtet, wenn:
Jedes einzelne Zeichen ist eine Klammer,
Jedes Paar von Klammern hat die richtige öffnende und schließende Klammer in der richtigen Reihenfolge und
Jede Klammer ist abgestimmt.
Sie können davon ausgehen, dass die Eingabe nur druckbares ASCII enthält .
Testen Sie IO
Hier sind einige Eingaben, die einen Wahrheitswert zurückgeben sollten:
()
[](){}<>
(((())))
({[<>]})
[{()<>()}[]]
[([]{})<{[()<()>]}()>{}]
Und hier sind einige Ausgaben, die einen falschen Wert zurückgeben sollten:
( Has no closing ')'
}{ Wrong order
(<)> Each pair contains only half of a matched element
(()()foobar) Contains invalid characters
[({}<>)> The last bracket should be ']' instead of '>'
(((())) Has 4 opening brackets, but only 3 closing brackets.
Wie üblich ist dies Codegolf, daher gelten Standardlücken und die kürzeste Antwort in Bytes gewinnt.
quelle
[}
eine Übereinstimmung? Und wenn nicht, wo wird es durch diese Regeln ausgeschlossen?Each pair of brackets has the correct opening and closing bracket and in the right order.
Antworten:
05AB1E , 19 Bytes
Die Eingabe erfolgt in Anführungszeichen . Code:
Naja Mist, viele Bugs und nicht implementierte Features wurden gefunden. Erläuterung:
Das ist eigentlich ein kniffliger Teil. Wie das im Pseudocode aussieht, ist:
Dies wird von diesem Teil aus dem 05AB1E-Code abgedeckt :
Wie Sie sehen, ist dies eine unendliche Ersetzung (solange, bis sich die Zeichenfolge nicht mehr ändert). Ich muss mich also nicht darum kümmern, die Ersetzung in eine Schleife zu setzen, da dies bereits eingebaut ist. Nachdem:
Verwendet die CP-1252- Codierung. Probieren Sie es online! (geringfügig geändert, da die obige Version veraltet ist).
quelle
õ
hinzugefügt?Brain-Flak ,
1101, 1085, 981 BytesProbieren Sie es online!
Dies sind 980 Byte Quellcode und
+1
für das-a
Flag, das ASCII-Eingabe (aber Dezimalausgabe) zulässt.Dies ist eine Antwort, die ich schon sehr lange schreiben wollte . Mindestens 6 Monate. Ich habe darauf gewartet, dies zu posten, weil ich wusste, dass die Beantwortung dieser Herausforderung in der Gehirnflocke besonders schwierig sein würde. Aber es lohnt sich aus einem sehr wichtigen Grund: Der Quellcode selbst ist eine wahrheitsgemäße Eingabe, die den gesamten Sinn dieser Sprache ausmacht.
Und als ich schrieb hier , war diese Frage , was mich inspiriert Gehirn-Flakfeuer zu schreiben.
Das Schreiben dieser Antwort dauerte ungefähr zwei Stunden. Ich gebe zu, es ist ziemlich schlecht golfen, vor allem, weil ein Großteil des Codes für jeden Bracket-Typ wiederholt wird. Aber ich bin größtenteils erstaunt, dass ich überhaupt eine Antwort schreiben konnte, vor allem angesichts der Tatsache, dass es Brain-Flak ist
Ich werde versuchen, es später abzuspielen, aber ich wollte es trotzdem rausbringen.
Ich habe eine ausführliche Erklärung, aber es ist ungefähr 6000 Zeichen lang, daher halte ich es für nicht ratsam, das Ganze in diese Antwort einzufügen. Sie können es hier nachlesen , wenn Sie möchten. Ich werde hier eine kürzere Erklärung hinzufügen.
Die Grundidee ist, dass wir die folgenden Schritte für jedes Zeichen auf dem Stapel wiederholen:
Wir überprüfen jedes Zeichen, um festzustellen, ob es zu einer Klammer passt. Wenn es sich um eine öffnende Klammer handelt, schieben wir eine Zahl gemäß der folgenden Zuordnung auf den anderen Stapel:
Dann prüfen wir, ob es zu einer schließenden Klammer passt. In diesem Fall legen wir die entsprechende Zahl auf den alternativen Stapel, genau wie beim Öffnen von Klammern. Dann prüfen wir, ob die beiden oberen Zahlen gleich sind. Wenn dies der Fall ist, werden beide geknackt und das Programm wird normal fortgesetzt. Wenn dies nicht der Fall ist, löschen wir beide Stapel (um die Schleife zu beenden) und schieben einen auf den alternativen Stapel. Dies ist im Wesentlichen eine "break" -Anweisung.
Nachdem wir die 8 Klammertypen überprüft haben, schieben wir den Wert dieses Laufs durch die Schleife. Da wir das meiste herausfinden, sind die einzigen Ausschnitte, die irgendeinen Wert haben, die Bedingungen, wenn wir sie mit Klammern vergleichen. Wenn also eine Klammer übereinstimmt, hat die gesamte Schleife den Wert 1. Wenn keine übereinstimmt, hat die gesamte Schleife den Wert 0. In diesem Fall werden beide Stapel gelöscht und eine 0 auf den alternativen Stapel gelegt. Auch dies ist wie eine "break" -Anweisung.
Nachdem diese Hauptschleife ausgeführt wurde, ist der Rest ziemlich einfach. Wir befinden uns auf dem (leeren) Hauptstapel, und der alternative Stapel ist leer (wenn die Klammern übereinstimmen) oder nicht leer, wenn sie nicht übereinstimmen. Also führen wir Folgendes aus:
Dies drückt eine 0 oder eine 1 auf den Hauptstapel und wenn das Programm endet, wird es implizit gedruckt.
Vielen Dank an @WheatWizard für die Erstellung eines guten Stack-Clean-Snippets "equals" und "logical not" und für die regelmäßige Aktualisierung des Github-Wikis mit nützlichen Beispielen.
Dank an @ ASCII-only für das Schreiben eines Online- Ganzzahl-Metagolfers, der beim Schreiben dieses Programms ungemein hilfreich war
Überarbeitungen
Einige Push-Pop-Redundanzen wurden entfernt
Änderte meine Nullzählerlogik
quelle
Brain-Flak ,
204196190 BytesProbieren Sie es online!
-8 Bytes dank Weizen-Assistent. -6 Bytes dank Jo King.
Erläuterung
Dieses Programm speichert die Zeichencodes aller aktuellen nicht geschlossenen Klammern auf dem zweiten Stapel. Die Halterungspaar
<>
,[]
und{}
haben jeweils Zeichencodes , die von genau 2 unterscheiden, so gibt es keine Notwendigkeit , die speziell für sie zu überprüfen. Das Paar()
unterscheidet sich nur um 1, daher überprüfen wir, ob es(
spezifisch ist, und dekrementieren dieses Byte effektiv (inkrementieren tatsächlich jedes zweite Byte), bevor wir fortfahren.quelle
([{}]<>({}))((){[()](<{}>)}{})
({<>[()]}())
durch -6 Bytes ersetzenJavaScript (ES6),
52 bis50 ByteEntfernen Sie wiederholt Klammern, bis das Ergebnis mit dem Original übereinstimmt, und geben Sie dann false zurück, es sei denn, die Zeichenfolge ist jetzt leer.
Bearbeiten: 2 Bytes dank @ edc65 gespeichert.
quelle
Netzhaut, 20 Bytes
Probieren Sie es online aus
quelle
CJam,
25242321 BytesDanke an Sp3000 für das Speichern von 2 Bytes.
Danke an jimmy23013 für das Speichern von 2 Bytes.
Testsuite.
Arbeitet im Wesentlichen die gleiche wie die anderen Antworten: wir immer wieder zu entfernen
()
,[]
,<>
und{}
aus dem String und prüfen , ob wir mit dem leeren String enden. Um nicht zu prüfen, wann wir fertig sind, entfernen wir die PaareN
mal, wobeiN
die Länge der Zeichenfolge immer ausreicht (da bei jeder Iteration mindestens zwei Zeichen entfernt werden, es sei denn, wir sind fertig). Ich bin froh zu sehen, dass dies Retina nicht besiegt. :) (Obwohl Pyth oder Jelly vielleicht ...)Hier gibt es einen lustigen Golftick: Um die Saite zu erhalten, verwenden
()<>[]{}
wir Folgendes:Das,
{()<>}
ist nur ein Block (dh eine Funktion), der die anderen Klammern als Code enthält. Mita
wickeln wir den Block in ein Array. Das`
stringifiziert das Array, das gibt"[{()<>}]"
. Zuletzt sortieren wir die Zeichenkette mit$
, wodurch die Klammern in neu angeordnet werden()<>[]{}
.quelle
()<>[]{}`
genauso gut und hat die gleiche Anzahl von Bytes, oder?()<>
sind vier Operatoren (Dekrementieren, Inkrementieren und dann Vergleichen oder Abschneiden, abhängig von den Operanden), die sofort ausgeführt werden würden, wohingegen{}
ein Block (CJams Äquivalent einer Funktion) bezeichnet wird, dh ein Stück Code, der gerade verschoben wird auf den Stapel, ohne ihn sofort auszuwerten. Das ist der Grund, warum ich{}
das()
und umhüllen muss<>
, aber dann ist die Verwendunga
zum Platzieren von allem in einem Array kürzer als[...]
.Python, 67 Bytes
Erzeugt und bewertet einen Ausdruck, der aussieht
und prüft, ob das Ergebnis leer ist.
Sp3000 sparte 8 Bytes, indem es darauf hinwies, dass
[],(),{}
es ohne Anführungszeichen eingebettet werden kann, da es sich um Python-Objekte handelt und zwei Parens nicht benötigt wurden.quelle
Ja, 119 Bytes
Regex / Replace wird nicht verwendet.
Ungolfed
Zusammenstellung
Verwendungszweck
quelle
Pyth,
312524 BytesDank FryAmTheEggMan auf 25 Byte reduziert 1 Byte entfernt
Probieren Sie es hier aus: Test Suite !
Ich bin immer noch ein Pyth-Neuling, jede Hilfe wird geschätzt.
Erläuterung
Übrigens, herzlichen Glückwunsch zu der anderen Pyth-Antwort (die derzeit 20 Bytes ist)
quelle
Vz=:z"<>|\[]|{}|\(\)"k;!z
. Insbesondere ist zu beachten, dass Sie im Grunde genommen nie verwenden müssen,l
wenn Sie die Zahl nicht wirklich benötigen, und=
die erste in einem Ausdruck verwendete Variable automatisch erraten. Lassen Sie mich wissen, wenn Sie möchten, dass ich im Pyth-Chatraum etwas anderes erkläre :)l
es unnötig war, das ist gut zu wissen. Zuerst habe ich eine Funktion deklariert, weil meine Logik anders war, und vergessen, sie zu entfernen. Soll ich Ihre Antwort auf meine aufnehmen? (Ich bin ein Neuling>. <)Pyth, 20 Bytes
Probieren Sie es online aus: Test Suite
Wiederholt entfernt Vorkommen von
[]
,()
,<>
und{}
durch Aufspalten und Wiederzusammenführen. Überprüft, ob die resultierende Zeichenfolge leer ist oder nicht.quelle
Javascript ES6, 54 Bytes
Verwendet eine rekursive Ersetzungsimplementierung. Einfach genug.
quelle
Regex (PCRE-Geschmack),
4137 BytesNur eine Standardlösung mit rekursivem regulären Ausdruck.
Danke jimmy23013, dass du 4 Bytes gespart hast
quelle
Perl,
3433 BytesBeinhaltet +2 für
-lp
Mit Eingabe auf STDIN ausführen:
brackets.pl
:Findet das erste Klammerpaar ohne irgendetwas dazwischen und entfernt es, solange es welche gibt. Überprüft dann, ob die letzte Zeichenfolge leer ist.
quelle
s/\(\)|\[]|<>|{}//&&redo;$_=!$_
funktionieren :)Brain-Flak , 204 Bytes
Probieren Sie es online!
Nicht ganz so kurz wie die Antwort von Nitroden , verwendet aber einen ganz anderen Ansatz. Dieser Befehl durchläuft die Eingabe wiederholt und entfernt jedes Mal benachbarte passende Klammerpaare, bis keine mehr vorhanden sind. Wenn zu diesem Zeitpunkt noch etwas auf dem Stapel vorhanden ist, wurde die Zeichenfolge nicht vollständig zugeordnet.
Erläuterung:
quelle
Brainfuck, 132 Bytes
Formatiert:
Erwartet Eingaben ohne abschließende Zeilenumbrüche. Druckt
\x00
für falsch und\x01
für wahr.Probieren Sie es online aus.
Ansatz: Behalten Sie einen Stapel bei
\x01
, der mit beginnt , und drücken Sie die entsprechende schließende Klammer, wenn eine öffnende Klammer angetroffen wird. Bevor Sie prüfen, ob das aktuelle Zeichen eine öffnende Klammer ist, prüfen Sie zunächst, ob es mit der schließenden Klammer oben auf dem Stapel übereinstimmt, und platzieren Sie sie gegebenenfalls. Wenn es weder die richtige schließende noch die öffnende Klammer ist, verbrauchen Sie den Rest der Eingabe, während Sie den Zeiger nach rechts bewegen. Überprüfen Sie am Ende, ob sich der Zeiger neben dem Anfangsbuchstaben befindet\x01
.quelle
Grime v0.1, 34 Bytes
Druckt
1
für eine Übereinstimmung und0
für keine Übereinstimmung. Probieren Sie es online!Erläuterung
Grime ist meine 2D-Pattern-Matching-Sprache, die für diese Herausforderung entwickelt wurde . Es kann auch verwendet werden, um 1D-Zeichenfolgen abzugleichen. Dies ist meine erste Antwort damit. Ich habe Grime heute modifiziert, aber nur, um den Charakter eines Syntaxelements (
`
statt,
) zu ändern , damit es meine Punktzahl nicht beeinflusst.quelle
Reng v.3.3, 137 Bytes, nicht konkurrierend
Probieren Sie es hier aus!
Es gibt noch ein bisschen mehr zu golfen, aber zumindest funktioniert es. Ich habe einen Befehl hinzugefügt
ð
, um die Stapel nach dieser Herausforderung zu verfolgen, damit dies aus der Ferne möglich / einfach ist. Ich werde das gleich erklären, aber es verfolgt im Allgemeinen alle Zeichenfolgen, die durchlaufen wurden, und sucht nach Wiederholungen. Wenn es eine Wiederholung gibt, ist die Zeichenfolge nicht reduzierbar. Andernfalls wird der String auf den leeren String / Stack reduziert und ausgegeben1
. Andernfalls wird keine Ausgabe erzeugt.quelle
PowerShell v2 +,
63 bis62 ByteKann JavaScript nicht ganz einfangen, verdrängt aber derzeit die anderen Nicht-Esolangs.
Ähnlicher Ansatz wie andere Antworten: eine einfache Schleife , die so lange weiter , wie wir entfernen
[]
,()
oder<>
(mit mehreren irrelevanten Zeichen , weil wir die Regex Angebote entkommen müssen). Wir verwenden sie$b
als Hilfe , um uns zu erinnern, wie unsere vorherigen Schleifen$a
eingestellt waren. Eine nicht initialisierte Variable ist$null
also$a
offensichtlich ungleich, wenn die Schleife zum ersten Mal angetroffen wird$null
.Am Ende der Schleife
$a
ist entweder leer oder nicht, und der Boolesche Wert dieser Zeichenfolge ist entwederTrue
oderFalse
.Beispiel
quelle
C
121122114 BytesRasiert von 8 Bytes dank @xsot!
Verwendet einen Stapel.
quelle
c%7&2
. Eigentlich brauchst du nichtk
. Stattdessen können Sie einfach inkrementieren,i
wo Sie Änderungen vornehmen würden,k
da Siei
ohnehin überprüfen müssen, ob irgendwann Null ist. So etwas wie dieser (ungetestet Code):a[99],i;main(c){for(;read(0,&c,1);c%7&2?i+=a[i--]^c/9:(a[++i]=c/9))i+=!strchr("()[]{}<>",c);putchar(48+!i);}
.a[99],i,k;main(c){for(;read(0,&c,!k);c%7&2?k|=a[i--]^c/9:(a[++i]=c/9))k|=!strchr("()[]{}<>",c);putchar(48+!i*!k);}
a[99],i;main(c){for(;read(0,&c,1);c%7&2?i+=a[i]^c/9?1:-1:(a[++i]=c/9))i+=!strchr("()[]{}<>",c);putchar(48+!i);}
Dies funktioniert jedoch noch nicht für Eingaben wie()))
, da das "Poppen" vom Stapel die Werte im Array nicht auf Null setzt.Java 7,
156151 BytesIch erwarte nicht, dass dies Preise gewinnt, aber ich habe noch keine Java-Antwort erhalten. Außerdem lauere ich gerne in PPCG herum und würde gerne über andere Antworten abstimmen / Kommentare abgeben.
Die Eingabe erfolgt als Programmparameter. Dies folgt dem gleichen Format wie viele andere Antworten hier, indem ein regulärer Ausdruck in einer Schleife ersetzt wird. Ursprünglich hatte ich es N-mal in der Schleife, wobei N die Länge der ursprünglichen Zeichenfolge ist, aber die Schleife zu
Integer.MAX_VALUE
kürzer ist:]. Dies sollte in Ordnung sein, daInteger.MAX_VALUE
es sich um die maximale Länge von aString
in Java handelt. Daher wird implizit davon ausgegangen, dass die Länge der Eingabe von Java verarbeitet werden kann. Die Laufzeit ist aufgrund der Schleife ziemlich schlecht (hat auf meinem Laptop ungefähr 20 Minuten gedauert), aber ich habe keine Einschränkung darin gesehen.quelle
Haskell , 151 Bytes
Probieren Sie es online!
quelle
(#)
mit dem leeren String als zweitem Argument aufgerufen werden muss, müssen Sie(#"")
auf Ihre Byteanzahl angerechnet werden. Auch nurTrue
undFalse
als wahr / falsch gelten, siehe den Guide to Golfing Rules .a:x#b:y|a==b=x#y
, wodurch sich die Anzahl der Bytes auf 113 verringertPython 2.7, 96 Bytes
quelle
Python 2, 80 Bytes
quelle
Julia, 51 Bytes
Die am wenigsten verrückte von mehreren Optionen. Es überrascht nicht, dass der kürzeste Weg zum String-Matching darin besteht, die Potenz von Regex zu nutzen. Dies gilt jedoch nur dann, wenn das zu vergleichende Muster regelmäßig ist. Wenn Sie versuchen, rekursive PCRE-Muster zu erstellen, wird die Größe des Codes vergrößert, indem Sie entweder feststellen, ob die gesamte Zeichenfolge übereinstimmt, oder indem Sie die Enden verankern und dann ein Konstrukt erstellen, um den inneren Körper für die Regex-Rekursion anzugeben. Weder von denen sind hübsch oder förderlich für Code Golf.
Erläuterung:
Die Funktion entfernt wiederholt benachbarte Klammerpaare aus ihrem einzigen Argument und gibt true zurück, wenn sie auf diese Weise eine leere Zeichenfolge ableiten kann.
quelle
sed,
3936 Bytes (34 für Code, 2 für -r)Probieren Sie es online!
sed-Version des scheinbar Standardansatzes. Benötigt erweiterte reguläre Ausdrücke (
sed -r
)3 Bytes gespart dank Cows Quack
quelle
a
heißt:a
undta
Bytes speichernq
von/./
und die Klammern dort auch fallen lassen können. Probieren Sie es online! Dies liegt daran, wiec
Hange funktioniert05AB1E, 9 Bytes
Die Eingabe erfolgt in Anführungszeichen.
Probieren Sie es online!
Erläuterung:
quelle
Clojure, 153 Bytes
Länger als C und Brainfuck antwortet: o
Verwendet keine regulären Ausdrücke, verwendet stattdessen das erste Zeichen, um zu bestimmen, was das schließende Tag ist, und findet den ersten Index, in dem diese Klammer ausgeglichen ist (kumulative Summe ist Null). Anschließend wird iterativ überprüft, ob die Angaben in Klammern und nach Klammern gültig sind.
Mal sehen, ob es einen besseren Ansatz gibt ...
quelle
Lua , 295 Bytes
Ungolfed Version
Probieren Sie es online!
quelle
Japt v2.0a0
-!
, 16 BytesVersuch es
quelle
R 298
Der Ansatz hier besteht darin, die Sequenz in R-Code umzuwandeln und dann zu analysieren und auszuwerten. Wenn dies zu einem Fehler führt, kehren Sie zurück
FALSE
.Aber es gibt ein kleines Problem ... R Regeln für Klammern sind unterschiedlich, so
<
und>
nicht Klammern überhaupt, und die anderen Typen haben Regeln ihrer eigenen. Dies wird durch einen revolutionären Ansatz gelöst - eine Quietschfunktion, deren einzige Funktion darin besteht, einen Fehler zu signalisieren, wenn Kopf und Schwanz auf unterschiedliche Weise quietschen.Zum Beispiel
[]
wird transformiert inS('[', {}, ']')
, wobei S definiert ist als ...Da das Kopfquietschen und das Schwanzquietschen übereinstimmen, wird kein Fehler geworfen.
Einige andere Beispiele (der linke Teil ist eine Folge von Klammern und der rechte Teil ist die Umwandlung in einen gültigen R-Code, der ausgewertet werden kann):
Einige andere Folgen von Klammern führen zu Analysefehlern:
Der verbleibende Teil fängt also nur die Fehler ab und gibt FALSE zurück, falls es welche gibt, und TRUE, falls es keine gibt.
Der für Menschen lesbare Code:
Anwendung auf Musterfälle:
quelle