Dies war eine von mehreren Herausforderungen, die zum Geburtstag von Brain-Flak führten. Mehr aus hier .
Herausforderung
Für diese Herausforderung besteht Ihr Ziel darin, das allererste Paar übereinstimmender Klammern in einer vollständig übereinstimmenden Klammerreihe zu finden ()[]{}<>
. So leihen Sie die Definition von DJMcMayhem für eine vollständig übereinstimmende Zeichenfolge aus:
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 nur dann als "vollständig passend" betrachtet, wenn jedes Klammerpaar die richtige öffnende und schließende Klammer in der richtigen Reihenfolge aufweist.
Eingang
Die Eingabe besteht aus einer einzelnen nicht leeren Zeichenfolge oder einem Zeichen-Array, das nur die Zeichen enthält ()[]{}<>
, und es wird garantiert, dass sie vollständig übereinstimmt. Sie können Eingaben in einer angemessenen Weise vornehmen, die unseren E / A-Standardwerten entspricht .
Ausgabe
Die Ausgabe Ihres Programms oder Ihrer Funktion ist der Index der Klammer, die die erste schließt. Die Ausgabe muss entweder 0
oder 1
indiziert sein. Auch hier kann die Ausgabe in einer angemessenen Weise erfolgen, die unseren E / A-Standardwerten entspricht .
Testfälle
Input 0-indexed 1-indexed
() 1 2
(<>) 3 4
<[]{<>}> 7 8
{}{}{}{} 1 2
[[]<>[]] 7 8
Das ist Code-Golf , die wenigsten Bytes gewinnen!
Antworten:
V , 4 Bytes
Probieren Sie es online!
Dies verwendet im Gegensatz zu den meisten V-Antworten eine 0-Indizierung. Ich bin sehr stolz auf diese Antwort und wie weit meine Sprache gekommen ist. Erläuterung:
quelle
Brain-Flak ,
685, 155, 151, 137 BytesProbieren Sie es online!
136 Byte Code plus ein Byte für
-a
. Einer indiziert.530 Bytes abgeschlagen! Das ist wahrscheinlich das größte Golf, das ich je gemacht habe.
14 Bytes gespart dank Riley!
Dies missbraucht eine Formel der öffnenden / schließenden Klammer: Wenn Sie die ASCII-Werte nehmen, um eins erhöhen und Modulo 4 annehmen, erhalten die openers (
({[<
) immer0
oder1
, wohingegen die closers ()}]>
) immer 2 oder 3 erhalten.Erläuterung:
quelle
n-1&2
/n+1&2
/-n&2
odern%7&2
, um öffnende und schließende Klammern zu unterscheiden ...&2
, aber ich werde es untersuchen.0
/1
und2
/ zu unterscheiden3
... obwohl Sie jetzt, wo ich es mir anschaue, nur dekrementieren, wenn es positiv ist. Ein cooler Trick auch :-)(TOS+1)%4
kann kürzer sein: Probieren Sie es online!05AB1E ,
17 1610 Bytes-1 dank carusocomputing
-6 danke an Adnan für seine erstaunliche Einsicht, dass "nach dem Inkrementieren das vorletzte Bit 0 für eine öffnende Klammer und 1 für eine schließende Klammer ist"
Probieren Sie es online!
quelle
žu
scheint hier verwendbar.žu8ÝÈÏ
Also, nein, nicht wirklich lol. Bestenfalls sind es noch 5 Bytes. Ich dachte mehr über eine Aufteilung in Klammerpaare nach und entferne Klammern, bis nur noch ein Paar übrig ist, und erhöhe den Zähler für jedes entfernte Paar um 2. Ich habe keine Ahnung, ob das weniger ist. Probieren Sie es aus atm.Ç>2&<.pO0k
.0
für eine öffnende und1
eine schließende Klammer gilt.Vim, 23 Bytes
Probieren Sie es online!
Ich bin sehr traurig über diese Antwort. Diese Lösung ist wunderschön elegant und kurz, aber standardmäßig berücksichtigt
<
und muss vim nicht>
angepasst werden, sodass ich 13 Byte Boilerplate-Code benötige. Andernfalls wären dies nur 10 Bytes.Ich hätte eine V Antwort geschrieben, aber das wäre nur ein Byte kürzer, nämlich seinen Wechsel
Vr
zuÒ
, daVr
ein gemeinsames vim-Idiom ist.Dies ist 1-indiziert, kann aber durch Ändern von
1
in a trivial modifiziert werden, um 0-indiziert zu werden0
.quelle
Jelly ,
11109 BytesProbieren Sie es online!
Erläuterung
Die Idee dabei war, eine "Zauberformel" zu finden, die das Öffnen von schließenden Klammern unterscheiden kann. Ich habe ursprünglich verwendet
O%7&2
(dh "nimm den ASCII-Code, Modulo 7, bitweise-und 2"), aber @ETHproductions schlug vorO’&2
(was das Modulo 7 durch ein Dekrement ersetzt); Beide geben 0 für eine Art von Klammer und 2 für die andere zurück. Durch Subtrahieren von 1 (’
) werden diese Ergebnisse zu -1 und 1.Der Rest des Codes ist
+\
.+\
ergibt eine kumulative Summe. Wenn ein Satz von Klammern korrekt übereinstimmt, enthält er die gleiche Anzahl von -1s und 1s, dh seine kumulative Summe ist 0. Dann müssen wir nur den Index der ersten 0 in der resultierenden Liste zurückgeben; das schaffen wir miti0
.quelle
b*2%7>3
Retina ,
2624 BytesProbieren Sie es online!
Ergebnis ist 1-basiert.
Erläuterung
Eine ganz andere Retina-Lösung, die im Wesentlichen auf einer einzigen (und sehr gut lesbaren ...) Regex basiert. Dies verwendet eine neue Technik, die ich gestern entdeckt habe, um ausgeglichene Saiten mit Hilfe von Ausgleichsgruppen abzugleichen .
Finde (
M
) und gib (!
) alle Übereinstimmungen des regulären Ausdrucks zurück^.(?<-1>([[({<])*.)*
. Dieser reguläre Ausdruck überspringt das erste Zeichen der Zeichenfolge und verwendet dann Ausgleichsgruppen, um die Verschachtelungstiefe zu verfolgen. Durch[({<
Erhöhen der Tiefe (nach Gruppen verfolgt1
) und jedes andere Zeichen wird die Tiefe verringert (im Prinzip.
kann die Tiefe auch durch Öffnen von Klammern verringert werden, aber da die Regex gierig übereinstimmt, wird der Backtracker dies niemals versuchen ). Der seltsame Trick ist, dass die(?<-1>...)
einschließende Gruppe1
funktioniert, weil das Herausspringen aus einer Bilanzgruppe am Ende der Gruppe erfolgt. Dies spart zwei Bytes gegenüber dem Standardansatz im Formular((open)|(?<-2>close))*
. Die Übereinstimmung endet notwendigerweise an der Klammer, die die erste schließt, da wir sie übersprungen haben, sodass sie in der Stapeltiefe nicht berücksichtigt wird (und die Stapeltiefe nicht negativ werden kann).Die Länge dieser Übereinstimmung ist der auf 0 basierende Index der gesuchten Klammer.
Zählen Sie einfach die Anzahl der leeren Übereinstimmungen in dieser Zeichenfolge. Der leere reguläre Ausdruck stimmt immer wieder überein, wenn Zeichen in der Zeichenfolge vorhanden sind. Dies gibt uns den 1-basierten Index der gesuchten Klammer.
quelle
Retina , 24 Bytes
Probieren Sie es online!
Dies ist inspiriert von Martin Enders Lösung .
Erläuterung
Die erste Zeile ist ein regulärer Ausdruck, der mit einem Zeichen übereinstimmt, gefolgt von einer ausgeglichenen Zeichenfolge, die bis zum Ende der Hauptzeichenfolge reicht (eine detaillierte Erläuterung der Verwendung von Ausgleichsgruppen in diesem regulären Ausdruck finden Sie in Martins Antwort). Da reguläre Ausdrücke von links nach rechts nach Übereinstimmungen suchen, wird das am längsten ausgeglichene richtige Subfix gefunden, dh alles nach der Klammer, die die erste schließt, sowie die Klammer selbst.
Die folgende Zeile ist leer, daher ersetzen wir die Übereinstimmung durch eine leere Zeichenfolge, was bedeutet, dass wir nur noch die verbleibenden Zeichen zählen müssen, um das (0-indizierte) gewünschte Ergebnis zu erhalten.
Die letzte leere Zeile zählt die Anzahl der Übereinstimmungen der leeren Zeichenfolge in der Zeichenfolge, die um eins höher ist als die Anzahl der Zeichen in der Zeichenfolge, entsprechend dem 1-indizierten Ergebnis.
quelle
Perl 5 , 28 Bytes
6 Bytes gespart, indem nur
.
anstelle[>})\]]
von Martin Enders Retina-Antwort verwendet wurde .27 Byte Code +
-p
Flag.Probieren Sie es online!
Rekursiver Regex, was für eine schöne Erfindung.
Der reguläre Ausdruck sucht nach einer öffnenden Klammer (
[<{([]
), gefolgt von einem rekursiven Aufruf (?0
), gefolgt von einer schließenden Klammer (.
). All dies ist nicht gierig (+?
), so dass es von Anfang an so kurz wie möglich ist. Der Index für das Ende des Spiels ist die Antwort, und wie es passiert, kann es in gefunden werden$+[0]
.quelle
JavaScript (ES6),
555352 Byte1 Byte dank @Adnan gespeichert
Nimmt man für jede öffnende Klammer den Zeichencode Mod 4, erhält man 0 oder 3; für die schließenden Klammern erhalten wir 1 oder 2. Daher können wir zwischen öffnenden und schließenden Klammern unterscheiden, indem wir den Zeichencode der Klammer negieren (der die Bits umdreht und 1 subtrahiert) und das zweitniedrigste Bit nehmen; das heißt
n&2
,.quelle
n-1&2
,-n&2
auch funktioniert?C
757256555445 BytesSeht es euch an , wie es online funktioniert .
Wenn die Ausgabe 1-indiziert statt 0-indiziert sein soll, ersetzen Sie die letzte
0
durch1
.quelle
Python 2.7 + Numpy,
8579 BytesMein erster Versuch, Code Golf zu spielen:
quelle
Brain-Flak , 97 Bytes (96 für Code, 1 für Flag)
Laufen Sie mit der
-a
Flagge.Probieren Sie es online!
Erläuterung:
Es funktioniert einfach, okay.
quelle
Retina , 34 Bytes
Probieren Sie es online!
Ergebnis ist 0-basiert.
Erläuterung
Ersetzen Sie das erste Zeichen durch ein
!
. Dies führt dazu, dass die gesuchte Klammer nicht übereinstimmt.Wandeln Sie Klammern, eckige Klammern und Klammern in spitze Klammern um. Da die Zeichenfolge garantiert vollständig übereinstimmt, kümmern wir uns überhaupt nicht um die tatsächlichen Typen, und dies spart im nächsten Schritt einige Bytes.
Wiederholt (
+
) jedes Zeichen in allen Übereinstimmungen von<!*>
mit!
s ersetzen . Das heißt, wir stimmen Paare von Klammern ab, die keine weiteren unverarbeiteten Klammern enthalten, und wandeln sie in weitere Ausrufezeichen um. Dadurch wird die gesamte Zeichenfolge mit Ausnahme der nicht angepassten schließenden Klammer in Ausrufezeichen umgewandelt.Zählen Sie die Anzahl der führenden Ausrufezeichen, die der 0-basierten Position des ersten Nicht-Ausrufezeichens (dh der nicht übereinstimmenden Klammer) entspricht. Die
\G
Anker stimmen jeweils mit dem vorherigen überein, weshalb das!
s nach dieser Klammer nicht berücksichtigt wird .quelle
(?!(2))
es einfach ist(?!2)
. Du meintest wahrscheinlich(?(2)(?!))
oder(?2)!)
. Du hast auch vergessen ein zu entkommen]
und das Finale+
muss sein*
.PHP, 116 Bytes
Online Version
quelle
<?php
?Python , 76 Bytes
Rekursive Funktion, die das ordinale 2. LSB als Flag für den Open-vs.-Close-Trick verwendet, den viele von Adnan (und wahrscheinlich auch andere) gefunden haben. Schwanz trifft, wenn die kumulative Summe von
-1
für offen und1
für geschlossen Null erreicht. Der Index wird in einer Variablen gespeichert, da er im Vergleich zur Verwendung von Bytes billigerlen(r)
ist. Die Indexierung basiert auf 1.Probieren Sie es online!
quelle
Rubin,
3534 BytesBasierend auf Dadas Perl5-Antwort . Die Ausgabe ist 1-indiziert. Erfordert, dass der Ruby-Interpreter mit der
-n
Option aufgerufen wird (implizitewhile gets
Schleife).Bearbeiten: Dies ist auch
3534 Bytes, aber ein weiterer möglicher Ausgangspunkt, um diese Antwort weiter zu reduzieren.Edit2: Unnötige Leerzeichen danach entfernt
p
.Edit3: Noch ein paar 34-Byte-Antworten.
quelle
Python 3 ,
59555049 BytesDer Ausgang ist 0-indiziert. Die Formel zur Bestimmung der Klammerrichtung wurde zuerst von @ETHProductions entdeckt und von @Adnan verbessert.
Probieren Sie es online!
quelle
Batch, 172 Bytes
1-indiziert.
<>
s sind natürlich Sonderzeichen in Batch, daher muss ich nicht nur überall Anführungszeichen setzen, sondern kann auch keine Tricks ausführen, z. B.goto
Beschriftungen.quelle
R, 126 Bytes
quelle
C 127 Bytes
Versuchen Sie es online
Ausgabe
quelle