Schreiben Sie ein Programm oder eine Funktion, die eine 8-Byte-Zeichenfolge enthält, die eines der Zeichen enthält, die so ()[]{}<>
angeordnet sind, dass die vier jeweiligen Klammertypen übereinstimmen. Beispielsweise ]<([){}>
ist eine Eingabe ungültig, da die eckigen Klammern nicht übereinstimmen (obwohl alle anderen dies tun).
Eine Ganzzahl ausgeben oder zurückgeben von 0
bis gibt an 6
, wie viele der sechs möglichen Paare der vier Klammertypen miteinander verbunden sind. Klammerpaare gelten als verriegelt, wenn genau eine Klammer eines Typs zwischen den Klammern des anderen Typs steht. So ([)]
und [(])
verriegelt sind , sondern ()[]
, []()
, ([])
, und [()]
sind es nicht.
Der kürzeste Code in Bytes gewinnt.
Ein- / Ausgabebeispiele
()[]{}<> : 0
([{<>}]) : 0
<>{[]}() : 0
{<>([])} : 0
<(>)[{}] : 1
<[({)}]> : 1
[{<}]>() : 2
{<>([}]) : 2
<{(>})[] : 3
[(]<){>} : 3
<([>{)}] : 4
(<{[>})] : 4
(<[{)>}] : 5
<{[(>})] : 5
[{<(]}>) : 6
(<{[)>}] : 6
quelle
7~f&
? Diese Antwort gefällt mir bereits und ich habe den Rest noch nicht einmal gelesen.Python 2, 163 Bytes
Dabei wird das Zeug zwischen jedem Paar übereinstimmender Klammern betrachtet und die Anzahl der einzelnen vorhandenen linken oder rechten Klammern gezählt. Die Summe von diesen geteilt durch zwei ist die Ausgabe.
Ich bin sicher, es könnte viel mehr von besseren Golfern als ich gespielt werden.
quelle
GNU sed -r, 147
Die Ausgabe ist gemäß dieser Meta-Antwort unär .
Hinweis: Ersetzen Sie diese
\t
durch die tatsächlichen tabZeichen, um die richtige Punktzahl zu erhalten. Das Programm wird jedoch so oder so mit GNU sed funktionieren.Probieren Sie es online aus .
quelle
Perl, 77 Bytes
76 Code + 1 Schalter
Übernimmt die Eingabe von STDIN und das Programm muss für jede Eingabe neu gestartet werden.
Erläuterung
y/.../.../
).for$x...
) einen Zähler für das Zeichen ($h{$x}++
).length $1
) und entfernen Sie beide Vorkommen dieses Zeichens aus der Zeichenfolge. Wenn die Zeichenfolge beispielsweise war([{([{<<
, gibt es zwei Zeichen[
und{
zwischen den beiden Zeichen(
. Nachdem die(
s verarbeitet wurden, wird die Zeichenfolge zu[{[{<<
und wir addieren 2 zur Gesamtzahl ($z
) der ineinandergreifenden Klammern.$z
($_=$z
)quelle
Pyth, 20 Bytes
Testsuite
JmC/CdTz
: Zunächst wird jedes Symbolpaar in ein einzelnes Zeichen konvertiert, indem jedes eingegebene Zeichen seinemCd
durch 10 (/ T
) geteilten Zeichencode zugeordnet wird. Dieser Code ist für jedes Paar gleich, unterscheidet sich jedoch zwischen allen Paaren. Die sich ergebende Zahl wird zurück in ein Zeichen umgewandelt, um später enthüllt zu werden (C
). Die resultierende Liste der Zeichen wird in gespeichertJ
.lsm@FPcsJd{J
: Jetzt ordnen wir die eindeutigen Zeichen inJ
({J
) zu. Wir beginnen mit dem Zerhacken der Zeichenfolge, die durch VerkettenJ
mit dem aktuellen Zeichen als Begrenzer (csJd
) gebildet wird. Ein Klammerpaar überlappt das aktuelle Paar, wenn es in der zweiten Gruppe und entweder in der ersten oder in der dritten Gruppe erscheint. Um Doppelzählungen zu vermeiden, werden nur der erste und der zweite Gruppenfall gezählt. Also entfernen wir die dritte Gruppe (P
) und nehmen den Schnittpunkt der verbleibenden Gruppen (@F
). Schließlich verketten wir die Überlappungszeichen (s
) und drucken die Länge des Resuts (l
).quelle
Python 3, 107
Basiert lose auf meiner CJam-Lösung.
quelle
Retina ,
128108646255 BytesWobei
<empty>
eine leere abschließende Zeile darstellt. Platzieren Sie zu Zählzwecken jede Zeile in einer separaten Datei und ersetzen Sie die\n
durch die tatsächlichen Zeilenvorschubzeichen. Zur Vereinfachung können Sie diesen entsprechenden Code mit dem-s
Flag aus einer einzelnen Datei verwenden:Die Ausgabe ist unär .
Erläuterung
Der erste
(
Befehl weist Retina an, den gesamten Code in einer Schleife auszuführen, bis eine Iteration aufhört, die Zeichenfolge zu ändern. In diesem Fall wird es für jeden Klammertyp immer viermal wiederholt.Dadurch wird einfach jede schließende Klammer in die entsprechende öffnende Klammer umgewandelt, sodass wir später die entsprechenden Klammern mit einem einfachen Rückverweis abgleichen können. (Diese Phase wird nach der ersten Iteration zu einem No-Op. Sie ist nur in der Schleife enthalten, da
T
bereits ein Backtick erforderlich ist. Das Hinzufügen(
kostet also nur eins statt zwei Bytes.)Dadurch werden die am weitesten links stehenden Klammern durch Zeilenumbrüche ersetzt. Wir verwenden
\D
, um Klammern von den1
s zu unterscheiden, die wir später in der Schleife zum Zählen hinzufügen. Das(.*)
am Ende stellt sicher, dass nur ein Paar ersetzt wird (da sich Übereinstimmungen nicht überlappen können).Die gesamte Regex befindet sich in einem Lookahead, dies entspricht also einer Position . Genauer gesagt entspricht es einer Position für jedes Klammerpaar, das durch die anderen Klammern getrennt wurde, die wir gerade in Zeilenumbrüche umgewandelt haben. A
1
wird in jede dieser Positionen eingefügt. Wir können die1
s einfach dort lassen, weil sie keine der anderen regulären Ausdrücke beeinflussen (weil die\D
s sicherstellen, dass wir sie nicht versehentlich zuordnen ).Schließlich entfernen wir die Zeilenumbrüche (dh die Platzhalter für den aktuellen Klammertyp). Dies bedeutet, dass wir das verbleibende Problem auf eine Zeichenfolge mit der Länge 6 reduziert haben, die nur drei Klammertypen enthält, ansonsten funktioniert es jedoch genauso.
Am Ende
1
bleiben nur die von uns eingegebenen s übrig, und ihre Anzahl entspricht genau der Anzahl der ineinandergreifenden Klammern.quelle
JavaScript (ES7),
121 bis117 ByteWow. Das hat Spaß gemacht. Ich skizzierte eine Antwortidee, als diese Herausforderung zum ersten Mal herauskam, aber sie war über 150 Byte lang und ich wollte mich nicht anstrengen, um Golf zu spielen. Ich bin gestern auf diese Idee in meinem Notizbuch gestoßen und habe beschlossen, nicht aufzuhören, darüber nachzudenken, bis ich sie vollständig ausprobiert habe. Am Ende habe ich zwei völlig neue Algorithmen geschrieben, von denen der erste einige Bytes kürzer ausfiel, nachdem ich mit Tonnen von Bit-Hacking etwa 25 Bytes abgelegt hatte.
Wie es funktioniert
Zuerst setzen wir Variablen
a
undb
bis0
.a
ist ein 4-Bit-Binärarray, in dem sich Klammernpaare befinden, undb
ist ein 16-Bit-Binärarray, in dem Klammernpaare miteinander verknüpft sind.Als nächstes durchlaufen wir jedes Zeichen
c
inx
und jedes Zeichend
in'0123'
. Zuerst bestimmen wir, um welche Art von Klammer es sichc
handelte=c.charCodeAt()/26-1|0
. Die Dezimalzeichencodes der einzelnen Klammertypen lauten wie folgt:Durch Teilen durch 26, Subtrahieren von 1 und Flooring ordnen wir diese jeweils 0, 1, 2 und 3 zu.
Als nächstes prüfen wir, ob diese Zahl dem aktuellen Wert von entspricht
d
. Wenn dies der Fall ist, geben wir entweder dend
Typ der dritten Klammer ein oder verlassen ihn , und klappen dasd
dritte Bita
mit eina^=1<<d
. Wenn es nicht, aber wir sind in derd
th Haltewinkelart, müssen wir den Flip -e
te Bit in demd
th 4-Bit - Abschnittb
. Das geht so:(a>>d&1)
Gibt dasd
th-Bit in zurücka
. Befinden wir uns innerhalb desd
Klammer-Typs, wird 1 zurückgegeben. Andernfalls wird 0 zurückgegeben. Als Nächstes verschieben wir dies umd*4+e
Bits nach links und XORb
um das Ergebnis. Wenn wir uns innerhalb desd
Typs der dritten Klammer befinden, ist diese XOR-Verknüpfung das dritted*4+e
Bit vonb
; sonst macht es nichts.Enthält am Ende der gesamten Schleife
b
eine Anzahl von 1-Bit, die dem doppelten Wert des gewünschten Rückgabewerts entspricht. Aber wir müssen noch herausfinden, wie viele Bits das sind. Hier kommt die Unterfunktion insf
Spiel:Wenn
y
0 ist, gibt dies einfach 0 zurück. Andernfalls nimmt es das letzte Bit vony
mity%2
und fügt dann das Ergebnis dery
erneuten Ausführung aller bis auf das letzte Bit durch die Funktion hinzu. Beispielsweise:Wir
b
durchlaufen diese Funktion und teilen das Ergebnis durch 2, und es gibt unsere Antwort.quelle
Oracle SQL 11.2, 206 Bytes
Nicht golfen:
quelle