Było to jedno z szeregu wyzwań poprzedzających urodziny Brain-Flaka. Dowiedz się więcej tutaj .
Wyzwanie
W tym wyzwaniu Twoim celem będzie znalezienie pierwszej pary pasujących nawiasów w całkowicie dopasowanym ciągu ()[]{}<>
nawiasów. Aby pożyczyć definicję w pełni dopasowanego ciągu DJMcMayhem :
Dla celów niniejszego wyzwanie, „uchwyt” jest każdy z tych znaków:
()[]{}<>
.Para nawiasów jest uważana za „dopasowaną”, jeśli nawiasy otwierające i zamykające są w odpowiedniej kolejności i nie zawierają w sobie znaków, takich jak
() []{}
Lub jeśli każdy podelement w nim również jest dopasowany.
[()()()()] {<[]>} (()())
Elementy podrzędne mogą być również zagnieżdżone na kilku warstwach.
[(){<><>[()]}<>()] <[{((()))}]>
Sznurek jest uważany za „w pełni dopasowany” wtedy i tylko wtedy, gdy każda para wsporników ma prawidłowy otwierający i zamykający wspornik we właściwej kolejności.
Wkład
Dane wejściowe będą składały się z pojedynczego niepustego łańcucha znaków lub tablicy znaków zawierającej tylko znaki ()[]{}<>
i gwarantuje się, że zostaną w pełni dopasowane. Możesz przyjmować dane wejściowe w dowolny rozsądny sposób, który odpowiada naszym ustawieniom domyślnym we / wy .
Wydajność
Wyjście twojego programu lub funkcji będzie indeksem nawiasu, który zamyka pierwszy. Wyjście musi być 0
lub 1
indeksowane. Ponownie, wyjście może być w dowolny rozsądny sposób, który odpowiada naszym domyślnym ustawieniom we / wy .
Przypadki testowe
Input 0-indexed 1-indexed
() 1 2
(<>) 3 4
<[]{<>}> 7 8
{}{}{}{} 1 2
[[]<>[]] 7 8
To jest golf golfowy , wygrywa najmniej bajtów!
Odpowiedzi:
V , 4 bajty
Wypróbuj online!
To, w przeciwieństwie do większości odpowiedzi V, wykorzystuje indeksowanie 0. Jestem niezwykle dumny z tej odpowiedzi i tego, jak daleko zaszedł mój język. Wyjaśnienie:
źródło
Brain-Flak ,
685, 155, 151, 137 bajtówWypróbuj online!
136 bajtów kodu plus jeden bajt dla
-a
. Jeden zindeksowany.530 bajtów grało w golfa! To chyba największy golf, jaki kiedykolwiek zrobiłem.
14 bajtów zapisanych dzięki Riley!
To narusza formułę nawiasu otwierającego / zamykającego: jeśli weźmiesz wartości ASCII, zwiększysz je o jeden i weź modulo 4, otwieracze (
({[<
) zawsze otrzymają0
lub1
, a zamykacze ()}]>
) zawsze otrzymają 2 lub 3.Wyjaśnienie:
źródło
n-1&2
/n+1&2
/-n&2
lubn%7&2
do rozróżnienia nawiasów otwierających i zamykających ...&2
, ale przyjrzę się temu.0
/1
i2
/3
... chociaż teraz, kiedy na to patrzę, zmniejszasz się, jeśli jesteś pozytywny. Świetna sztuczka :-)(TOS+1)%4
Może być krótszy: Spróbuj online!05AB1E ,
17 1610 bajtów-1 dzięki carusocomputing
-6 dzięki Adnanowi za jego niesamowity wgląd w to, że „po zwiększeniu drugi bit to 0 dla nawiasu otwierającego i 1 dla nawiasu zamykającego”
Wypróbuj online!
źródło
žu
wydaje się użyteczna tutaj.žu8ÝÈÏ
więc nie, nie bardzo lol. W najlepszym razie będzie to nadal 5 bajtów. Myślałem bardziej o podziale na pary nawiasów klamrowych i usuwaniu nawiasów klamrowych, dopóki nie pozostanie tylko jedna para, licznik przyrostów o 2 dla każdej usuniętej pary. Nie mam pojęcia, czy to mniej. Wypróbowanie bankomatu.Ç>2&<.pO0k
.0
wspornika otwierającego i1
zamykającego.Vim, 23 bajty
Wypróbuj online!
Bardzo mi przykro z powodu tej odpowiedzi. To rozwiązanie jest pięknie eleganckie i krótkie, ale domyślnie vim nie bierze pod uwagę
<
i nie>
należy go dopasowywać, więc potrzebuję 13 bajtów kodu typu Boiler Plate. W przeciwnym razie byłoby to tylko 10 bajtów.Chciałbym opublikować odpowiedź V, ale byłby to tylko jeden bajt krótszy, mianowicie zmiana
Vr
naÒ
, ponieważVr
jest to powszechny idiom.Jest to indeksowane 1, ale może być w trywialny sposób modyfikowane, aby było indeksowane 0 poprzez zmianę na
1
a0
.źródło
Galaretka ,
11109 bajtówWypróbuj online!
Wyjaśnienie
Pomysł polegał na znalezieniu „magicznej formuły”, która odróżniałaby otwieranie od nawiasów zamykających. Pierwotnie użyłem
O%7&2
(tj. „Weź kod ASCII, modulo 7, bitowe-i 2”), ale sugerowałem @ETHproductionsO’&2
(który zastępuje modulo 7 zmniejszeniem); oba zwracają 0 dla jednego rodzaju nawiasu i 2 dla drugiego. Odejmowanie 1 (’
) spowoduje, że wyniki te będą równe -1 i 1.Reszta kodu to
+\
.+\
tworzy łączną sumę. Jeśli zestaw nawiasów jest poprawnie dopasowany, będzie zawierał tę samą liczbę -1 i 1s, tzn. Jego suma będzie wynosić 0. Następnie wystarczy zwrócić indeks pierwszego 0 na wynikowej liście; możemy to zrobić za pomocąi0
.źródło
b*2%7>3
Siatkówka ,
2624 bajtówWypróbuj online!
Wynik jest oparty na 1.
Wyjaśnienie
Zupełnie inne rozwiązanie Retina, które zasadniczo opiera się na jednym (i bardzo czytelnym ...) wyrażeniu regularnym. Wykorzystuje nową technikę, którą odkryłem wczoraj, do dopasowywania zrównoważonych ciągów za pomocą grup równoważących .
Znajdź (
M
) i return (!
) wszystkie dopasowania wyrażenia regularnego^.(?<-1>([[({<])*.)*
. Wyrażenie regularne pomija pierwszy znak ciągu, a następnie używa grup równoważących do śledzenia głębokości zagnieżdżenia. Każda z[({<
wzrostem głębokości (śledził przez grupę1
) i każda inna postać zmniejsza głębokość (w zasadzie.
pozwala na głębokość być zmniejszona przez nawiasach otwierających jak dobrze, ale ponieważ regex jest dopasowany łapczywie The backtracker nigdy nie próbować, że ). Dziwną sztuczką jest to, że(?<-1>...)
otacza grupę,1
która działa, ponieważ wyskakiwanie z grupy równoważącej odbywa się na końcu grupy. To oszczędza dwa bajty w stosunku do standardowego podejścia w formularzu((open)|(?<-2>close))*
. Mecz koniecznie kończy się na wsporniku, który zamyka pierwszy, ponieważ go pominęliśmy, więc nie jest uwzględniany na głębokości stosu (a głębokość stosu nie może być ujemna).Długość tego dopasowania jest indeksem nawiasu, którego szukamy.
Po prostu policz liczbę pustych dopasowań w tym ciągu. Pusty wyrażenie regularne zawsze pasuje raz, niż w łańcuchu są znaki, więc daje nam to indeks 1 nawiasu, którego szukamy.
źródło
Siatkówka , 24 bajty
Wypróbuj online!
Jest to inspirowane rozwiązaniem Martina Endera .
Wyjaśnienie
Pierwszy wiersz to wyrażenie pasujące do znaku, po którym następuje zrównoważony ciąg znaków prowadzący do końca łańcucha głównego (szczegółowe wyjaśnienie, w jaki sposób grupy równoważące są używane w tym wyrażeniu, patrz odpowiedź Martina). Ponieważ wyrażenia regularne szukają dopasowań od lewej do prawej, znajdzie to najdłuższy zrównoważony prawidłowy podrostek, czyli wszystko po nawiasie zamykającym pierwszy plus sam nawias.
Poniższy wiersz jest pusty, więc zastępujemy dopasowanie pustym łańcuchem, co oznacza, że teraz musimy tylko policzyć pozostałe znaki, aby uzyskać pożądany (0-indeksowany) wynik.
Ostatni pusty wiersz zlicza liczbę dopasowań pustego ciągu w ciągu, który jest o jeden większy niż liczba znaków w ciągu, co odpowiada wynikowi o indeksie 1.
źródło
Perl 5 , 28 bajtów
Zaoszczędzono 6 bajtów, używając tylko
.
zamiast[>})\]]
, z odpowiedzi Retina Martina Endera .27 bajtów kodu +
-p
flaga.Wypróbuj online!
Recursive regex, co za piękny wynalazek.
Wyrażenie regularne szuka nawiasu otwierającego (
[<{([]
), po którym następuje wywołanie rekurencyjne (?0
), a następnie nawiasu zamykającego (.
). Wszystko to nie jest zachłanne (+?
), więc od początku pasuje tak krótko, jak to możliwe. Indeks końca meczu jest odpowiedzią i jak się zdarza, można go znaleźć w$+[0]
.źródło
JavaScript (ES6),
555352 bajtyZapisano 1 bajt dzięki @Adnan
Przy każdym nawiasie otwierającym pobranie modu char-code 4 daje nam 0 lub 3; dla nawiasów zamykających daje nam 1 lub 2. Dlatego możemy rozróżnić nawiasy otwierające i zamykające, negując kod znakowy nawiasu (który odwraca bity i odejmuje 1) i biorąc drugi najmniej znaczący bit; to jest
n&2
,.źródło
n-1&2
,-n&2
współpracuje również?C,
757256555445 bajtówZobacz, jak działa online .
Jeśli chcesz być wyjście do 1 indeksowane zamiast 0 indeksowane, wymienić ostatnią
0
z1
.źródło
Python 2.7 + Numpy,
8579 bajtówMoja pierwsza próba kodowania golfa:
źródło
Brain-Flak , 97 bajtów (96 dla kodu, 1 dla flagi)
Uruchom z
-a
flagą.Wypróbuj online!
Wyjaśnienie:
Po prostu działa, dobrze.
źródło
Retina , 34 bajty
Wypróbuj online!
Wynik jest oparty na 0.
Wyjaśnienie
Zamień pierwszy znak na
!
. To powoduje, że nawias, którego szukamy, nie ma sobie równych.Konwertuj nawiasy, nawiasy kwadratowe i nawiasy klamrowe na nawiasy kątowe. Ponieważ ciąg znaków jest w pełni dopasowany, w ogóle nie dbamy o rzeczywiste typy, a to oszczędza niektóre bajty w następnym kroku.
Wielokrotnie (
+
) zastąpić każdy znak we wszystkich meczów<!*>
z!
s. Oznacza to, że dopasowujemy pary nawiasów, które nie zawierają żadnych nieprzetworzonych nawiasów, i przekształcamy je w dalsze wykrzykniki. Spowoduje to obrócenie całego łańcucha oprócz niedopasowanego nawiasu zamykającego w wykrzykniki.Policz liczbę wiodących wykrzykników, która jest równa zerowej pozycji pierwszego nie wykrzyknika (tzn. Niedopasowanego nawiasu). Każda
\G
kotwica pasuje do poprzedniej, dlatego nie liczy się!
s po tym nawiasie.źródło
(?!(2))
jest po prostu(?!2)
. Prawdopodobnie miałeś na myśli(?(2)(?!))
lub(?2)!)
. Zapomniałeś także o ucieczce]
i ostateczna+
musi być*
.PHP, 116 bajtów
Wersja online
źródło
<?php
?Python , 76 bajtów
Funkcja rekurencyjna, która używa porządkowego drugiego LSB jako flagi dla sztuczki open vs close używanej przez wielu znalezionych przez Adnana (i prawdopodobnie innych). Ogon uderza, gdy skumulowana suma
-1
dla otwarcia i1
dla zamknięcia osiągnie zero. Indeks jest przechowywany w zmiennej, ponieważ jest tańszy bajtowo niż przy użyciulen(r)
, indeksowanie jest oparte na 1.Wypróbuj online!
źródło
Rubin,
3534 bajtówNa podstawie odpowiedzi Perl5 autorstwa Dady . Dane wyjściowe są indeksowane 1. Wymaga wywołania interpretera Ruby z
-n
opcją (niejawnawhile gets
pętla).Edycja: Jest to również
3534 bajtów, ale jest kolejnym możliwym punktem wyjścia do dalszego ograniczenia tej odpowiedzi.Edycja2: Usunięto niepotrzebne spacje po
p
.Edycja3: Kilka dodatkowych 34-bajtowych odpowiedzi.
źródło
Python 3 ,
59555049 bajtówWyjście jest indeksowane na 0. Formuła określająca kierunek nawiasu została po raz pierwszy odkryta przez @ETHProductions i ulepszona przez @Adnan.
Wypróbuj online!
źródło
Partia, 172 bajty
1-indeksowany.
<>
s są oczywiście znakami specjalnymi w Batch, więc nie tylko muszę zacytować wszystko, ale nawet nie mogę wykonywać takich sztuczek, jak tworzeniegoto
etykiet.źródło
R, 126 bajtów
źródło
C, 127 bajtów
Wypróbuj online
Wydajność
źródło