Napisz program lub funkcję, która pobiera ośmiobajtowy ciąg zawierający jeden z każdego ze znaków ()[]{}<>
ułożonych w dowolny sposób, tak aby pasowały do nich cztery odpowiednie typy nawiasów. Na przykład ]<([){}>
niepoprawne dane wejściowe, ponieważ nawiasy kwadratowe nie pasują (chociaż wszystkie pozostałe się zgadzają).
Drukuj lub zwrócić liczbę całkowitą od 0
do 6
oznaczająca ilu z sześciu możliwych par z czterech typów zamków są zablokowane. Pary typów wsporników są uważane za powiązane, jeśli między wspornikami drugiego typu występuje dokładnie jeden wspornik jednego typu. Tak ([)]
i [(])
są blokowane, ale ()[]
, []()
, ([])
, i [()]
nie są.
Najkrótszy kod w bajtach wygrywa.
Przykłady wejścia / wyjścia
()[]{}<> : 0
([{<>}]) : 0
<>{[]}() : 0
{<>([])} : 0
<(>)[{}] : 1
<[({)}]> : 1
[{<}]>() : 2
{<>([}]) : 2
<{(>})[] : 3
[(]<){>} : 3
<([>{)}] : 4
(<{[>})] : 4
(<[{)>}] : 5
<{[(>})] : 5
[{<(]}>) : 6
(<{[)>}] : 6
źródło
7~f&
? Podoba mi się już ta odpowiedź i nawet jej nie przeczytałem.Python 2, 163 bajty
Spogląda na rzeczy między każdą parą pasujących nawiasów i liczy liczbę obecnych lewych lub prawych nawiasów. Ich suma podzielona przez dwa stanowi wynik.
Jestem pewien, że golfiści mogliby grać o wiele lepiej niż ja.
źródło
GNU sed -r, 147
Dane wyjściowe są jednoargumentowe zgodnie z tą meta-odpowiedzią .
Uwaga: Zamień na
\t
rzeczywiste tabpostacie, aby uzyskać prawidłowy wynik. Jednak program będzie działał w obu przypadkach z GNU sed.Wypróbuj online .
źródło
Perl, 77 bajtów
76 kod + 1 przełącznik
Pobiera dane wejściowe ze STDIN i program musi być uruchamiany od nowa dla każdego wejścia.
Wyjaśnienie
y/.../.../
).for$x...
) zwiększ licznik dla znaku ($h{$x}++
).length $1
) i usuń oba wystąpienia tego znaku z ciągu. Na przykład, jeśli ciąg był([{([{<<
, istnieją dwa znaki[
i{
między nimi(
. Po(
przetworzeniu s ciąg staje się[{[{<<
i dodajemy 2 do całkowitej liczby ($z
) nawiasów blokujących.$z
($_=$z
)źródło
Pyth, 20 bajtów
Zestaw testowy
JmC/CdTz
: Po pierwsze, konwertuje każdą parę symboli na pojedynczy znak, odwzorowując każdy znak wejściowy na kod znaku (Cd
) podzielony przez 10 (/ T
), który jest taki sam dla każdej pary, ale różny dla wszystkich par. Wynikowa liczba jest konwertowana z powrotem na znak w celu ujawnienia jej później (C
). Wynikowa lista znaków jest zapisywana wJ
.lsm@FPcsJd{J
: Teraz mapujemy unikalne znaki wJ
({J
). Zaczynamy od cięcia łańcucha utworzonego przez konkatenacjęJ
przy użyciu bieżącego znaku jako ogranicznika (csJd
). Para nawiasów pokrywa się z bieżącą parą, jeśli pojawia się w drugiej grupie i pierwszej lub trzeciej grupie. Aby uniknąć podwójnego liczenia, policzymy pierwszy i drugi przypadek grupy. Dlatego usuwamy trzecią grupę (P
) i przecinamy pozostałe grupy (@F
). Na koniec łączymy nakładające się znaki (s
) i drukujemy długość resut (l
).źródło
Python 3, 107
Luźno oparty na moim rozwiązaniu CJam.
źródło
Siatkówka ,
128108646255 bajtówGdzie
<empty>
oznacza pustą linię końcową. Dla celów zliczania umieść każdą linię w osobnym pliku i zastąp\n
rzeczywistymi znakami linii. Dla wygody możesz użyć tego równoważnego kodu z-s
flagą z jednego pliku:Wyjście jest jednoargumentowe .
Wyjaśnienie
Pierwszy
(
mówi Retinie, aby wykonała cały kod w pętli, aż iteracja przestanie zmieniać ciąg. W takim przypadku zawsze będzie iterować cztery razy, raz dla każdego typu nawiasu.To po prostu zamienia każdy wspornik zamykający w odpowiedni wspornik otwierający, dzięki czemu możemy później dopasować odpowiednie wsporniki za pomocą prostego odsyłacza wstecznego. (Ten etap staje się brakiem operacji po pierwszej iteracji. Jest on zawarty tylko w pętli, ponieważ
T
już wymagał backstick, więc dodanie(
kosztuje tylko jeden zamiast dwóch bajtów.)Zastępuje skrajnie lewą parę nawiasów znakiem nowej linii. Używamy
\D
do odróżnienia nawiasów od1
s, które dodajemy później w pętli do zliczania. Na(.*)
końcu zapewnia zastąpienie tylko jednej pary (ponieważ dopasowania nie mogą się pokrywać).Cała regex jest z wyprzedzeniem, więc pasuje do pozycji . Dokładniej, dopasowuje jedną pozycję dla każdej pary nawiasów, która została oddzielona przez inne nawiasy, które właśnie zamieniliśmy w nowe linie. A
1
jest wstawiane w każdą z tych pozycji. Możemy po prostu zostawić1
tam s, ponieważ nie wpływają one na żadne inne wyrażenia regularne (ponieważ\D
s zapewniają, że nie dopasujemy ich przypadkowo).Na koniec usuwamy znaki nowej linii (tj. Symbole zastępcze dla bieżącego typu nawiasów) - oznacza to, że zredukowaliśmy pozostały problem do ciągu o długości 6 zawierającego tylko 3 rodzaje nawiasów, ale w przeciwnym razie działa dokładnie tak samo.
Na końcu
1
pozostaną tylko s, które wstawiliśmy, a ich ilość odpowiada dokładnie liczbie blokujących się nawiasów.źródło
JavaScript (ES7),
121117 bajtówŁał. To było zabawne. Naszkicowałem pomysł na odpowiedź, kiedy to wyzwanie się pojawiło, ale miało ponad 150 bajtów i nie chciałem w to grać. Wczoraj natknąłem się na ten pomysł w zeszycie i zdecydowałem, że nie przestanę o nim myśleć, dopóki go w pełni nie zagram. Skończyło się na napisaniu dwóch zupełnie nowych algorytmów, z których pierwszy skończył kilka bajtów krócej po graniu w golfa około 25 bajtów z mnóstwem hackowania bitów.
Jak to działa
Najpierw musimy ustawić zmienne
a
ib
do0
.a
to 4-bitowa tablica binarna, w której aktualnie znajdują się pary nawiasów, orazb
16-bitowa tablica binarna, której pary nawiasów są ze sobą połączone.Następnie, pętla przez każdego znaku
c
wx
, i każdego chard
w'0123'
. Najpierw określamy, jakiego rodzajuc
jest nawiase=c.charCodeAt()/26-1|0
. Kody dziesiętne dla każdego typu nawiasów są następujące:Dzieląc przez 26, odejmując 1 i podłogę, mapujemy je odpowiednio na 0, 1, 2 i 3.
Następnie sprawdzamy, czy liczba ta jest równa bieżącej wartości
d
. Jeśli tak, to wchodzimy lub wychodzimy zd
nawiasów typu th, więc włączamyd
th zaa
pomocąa^=1<<d
. Jeśli tak nie jest, ale są wewnątrzd
-tego wspornika, musimy odwróciće
nieco th wd
XX sekcji 4-bitowejb
. Odbywa się to w następujący sposób:(a>>d&1)
Zwracad
th tha
. Jeśli jesteśmy wewnątrzd
typu nawiasów, zwraca 1; w przeciwnym razie zwraca 0. Następnie przesuwamy to w lewo od*4+e
bity, a XORb
o wynik. Jeśli jesteśmy wewnątrzd
typu nawiasów klamrowych, to XOR jestd*4+e
tym kawałkiemb
; w przeciwnym razie nic nie robi.Na końcu całego zapętlenia
b
będzie zawierać liczbę 1 bitów równą dwukrotności pożądanej wartości zwrotnej. Ale nadal musimy dowiedzieć się, ile to jest bitów. Właśnie tutajf
pojawia się podfunkcja :Jeśli
y
ma wartość 0, to po prostu zwraca 0. W przeciwnym razie bierze ostatni bity
zy%2
, a następnie dodaje wyniky
ponownego uruchomienia funkcji za wyjątkiem bitu ostatniego . Na przykład:Przeglądamy
b
tę funkcję i dzielimy wynik przez 2, i jest nasza odpowiedź.źródło
Oracle SQL 11.2, 206 bajtów
Bez golfa:
źródło