Grupę parens nazywamy otwartym parenem (
, jego pasującym ścisłym parenem )
i wszystkim, co się w nim znajduje.
Grupa lub ciąg znaków Parens nazywa się zrównoważonym w nawiasach, jeśli nie zawiera nic lub zawiera tylko dwie grupy zrównoważonych w nawiasach.
Na przykład:
The string "(()())()" is parenthesly balanced
( )() Because it contains exactly 2 parenthesly balanced parens groups
()() The left one is parenthesly balanced because it contains 2 parenthesly balanced parens groups (balanced because they are empty). The right one is parenthesly balanced because it contains nothing.
Również:
The string "(()(()))()" is not parenthesly balanced
( )() Because it contains a parens group that is not parenthesly balanced: the left one
()( ) The left one is not balanced because it contains a parens group that is not balanced: the right one
() The right one is not balanced because it only contains one balanced group.
Zatem nawiasowo zrównoważony ciąg lub grupa parens powinna:
- Nic nie zawierają.
- Lub zawierają tylko i dokładnie 2 nawiasowo zrównoważone grupy parens. Nie powinien zawierać nic więcej.
Zadanie:
Twoim zadaniem jest napisanie funkcji lub programu, który sprawdza, czy dany łańcuch jest nawiasowo zrównoważony, czy nie.
Wejście:
Dane wejściowe będą ciągiem znaków lub listą znaków lub czymś podobnym. Możesz założyć, że ciąg będzie składał się wyłącznie ze znaków '('
i ')'
. Możesz również założyć, że każdy otwarty paren (
będzie miał pasujący ścisły paren )
, więc nie martw się o ciągi takie jak "((("
lub ")("
lub "(())("
...
Uwaga: Jak wspomniano w jego komentarz mieszka przez @DigitalTrauma, to jest ok, aby subtitute z ()
combo za pomocą innych znaków (takich jak <>
, []
...), czy to powoduje dodatkową pracę jak ucieczka w niektórych językach
Wynik:
Wszystko, co sygnalizuje, czy łańcuch jest nawiasowo zbalansowany, czy nie (prawda czy fałsz, 1 lub 0, ...). Podaj w swojej odpowiedzi, co ma przynieść twoja funkcja / program.
Przykłady:
"" => True
"()()" => True
"()(()())" => True
"(()(()(()())))(()())" => True
"(((((((()())())())())())())())()" => True
"()" => False
"()()()" => False
"(())()" => False
"()(()(())())" => False
"(()())(((((()())()))())())" => False
"()(()()()())" => False
"()(()(()())()())" => False
Dwa ostatnie przykłady naprawdę zrobiły różnicę!
Powodzenia!
źródło
"(()())()"
byłby reprezentowany jako[0, 0, 1, 0, 1, 1, 0, 1]
. To wyeliminowałoby konieczność konwertowania danych wejściowych na kod znakowy, a następnie odejmowanie.Odpowiedzi:
Japt v2, 20 bajtów
Przetestuj online!
Wszyscy początkowo źle zrozumieli wyzwanie i chociaż każda para nawiasów musiała zawierać parzystą liczbę podpar, podczas gdy w rzeczywistości wyzwanie wymaga 0 lub 2 podpar. Oto moja poprawiona odpowiedź, przy użyciu tej samej techniki, co poprzednio.
Nadal możemy rozwiązać wyzwanie za pomocą rekurencyjnej zamiany. Chodzi o to, że zamiast po prostu usunąć wszystkie wystąpienia
()()
, musimy upewnić się, że nie ma nic innego w tym samym opakowaniu oprócz()()
(innymi słowy, nie()()()()
lub coś takiego). Możemy to zrobić poprzez zastąpienie rekurencyjnie(()())
z()
.Nowy problem polega na tym, że samo wejście nie ma jednej pary nawiasów zewnętrznych (ponieważ w ten sposób nie byłby ciągiem nawiasowo zrównoważonym), co zmusiło nas do zawinięcia go w dodatkową parę, aby w pełni go zmniejszyć. Wreszcie, wynik końcowy dla zbalansowanych ciągów jest teraz
()
zamiast pustego łańcucha, więc sprawdzamy równość, a nie tylko logiczne NIE wyniku.źródło
sed 4.2.2, 30
Wypróbuj online .
Zwraca kod wyjścia powłoki 1 dla True i 0 dla False.
źródło
Perl 5- LP,
2422 bajtówWypróbuj online! Link zawiera przypadki testowe. Edycja: Zapisano 2 bajty dzięki @JoKing. Objaśnienie: Po prostu rekursywne wyrażenie regularne. Zewnętrzna grupa przechwytująca reprezentuje zrównoważony ciąg,
<
po którym następuje opcjonalny zrównoważony ciąg, po którym następuje>
dwukrotne. Zauważ, że większość innych odpowiedzi jest w stanie użyć()
s, ale kosztuje to dodatkowe dwa bajty:Wypróbuj online! Link zawiera przypadki testowe.
źródło
<>
()
s, więc nie sądziłem, że to uczciwe porównanie, jednak widzę, że odpowiedź APL @ ngn również używa<>
s, więc zaktualizowałem tę.Procedura kodu maszynowego 6502 , 48 bajtów
Oczekuje wskaźnika do łańcucha w
$fb
/,$fc
który powinien zawierać tylko(
i)
. Czyści flagę C (Przenoszenie), jeśli łańcuch jest „zbalansowany nawiasowo”, ustawia go inaczej (co jest typowym idiomem w 6502, zestaw przenosi „na błąd”). Nie robi nic sensownego przy nieprawidłowym wprowadzeniu.Chociaż algorytm jest rekurencyjny, nie wywołuje się sam (co wymagałoby więcej bajtów i uzależnia pozycję kodu), ale zachowuje samą głębokość rekurencji i używa „prostego” rozgałęzienia.
Skomentowano demontaż
Przykładowy program asemblerowy C64 wykorzystujący procedurę:
Demo online
Kod w składni ca65 :
źródło
V ,
21, 20 bajtówWypróbuj online! lub Zweryfikuj wszystkie przypadki testowe!
Hexdump:
źródło
Brachylog , 28 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
C (gcc) , 113 bajtów
Wypróbuj online!
Wyjaśnienie
Wypróbuj online!
źródło
MATL ,
2625 bajtówWypróbuj online!
Dzięki odpowiedzi @ETHProductions na pomysł „zamień (() ()) na ()” i komentarzu @JungHwan Min do pomysłu postrzegania nawiasów jako cyfr binarnych.
Dane wyjściowe to pusta tablica dla prawdy, liczba dodatnia dla falsey - co, jak sądzę, jest dozwolone w komentarzu OP: „Mogą to być kategorie. Tj. Wartości prawdy, aby zasygnalizować prawdziwość, a wartości fałsz, aby zasygnalizować inaczej”. Jeśli nie, możemy dodać
n
na końcu +1 bajt, aby mieć 0 jako wyjście zgodne z prawdą i 1 jako wyjście falsey.Z komentarzami:
źródło
C # (.NET Core) ,
7871 bajtówWypróbuj online!
źródło
Haskell ,
8259 bajtówWypróbuj online!
Zakładam, że można grać w golfa znacznie dalej, ponieważ po raz pierwszy grałem w Haskell, więc wszelkie sztuczki i komentarze są mile widziane.
EDYCJA - Dzięki @nimi za zaoszczędzenie 23 bajtów (ponad 28% oryginalnego zgłoszenia :)
źródło
()
robićy+1
. Ponieważ funkcje nienazwane są dozwolone, możesz upuścićf=
,r[0]
to właściwa funkcja. Połóż skrzynkę podstawowąr b[]
na końcu i przełącz na funkcję infix (powiedzmy#
), wtedy możesz użyćb#_=
. Możesz także nieznacznie zmienić algorytm, budując listę, aby sprawdzić krok po kroku0
s i2
s, zamiast przenosić ją wokół połączeńr
w akumulatorzer(x:y:z) ... = x : r (...) a
z obudową podstawowąr b [] = b
. Sprawdź po pierwszym połączeniur[0]
. W sumie 73 bajty.foldl
(59 bajtów): Wypróbuj online! .JavaScript (ES6), 63 bajty
Pobiera dane wejściowe jako tablicę znaków. Zwraca false dla nawiasowo zrównoważony, true dla nie nawiasowo zrównoważony.
Wypróbuj online!
Skomentował
Rekurencyjny, 54 bajty
Używanie zamienników rekurencyjnych (jak w odpowiedzi Japt ETHproductions ) jest jednak znacznie krótsze.
Pobiera dane wejściowe jako ciąg. Zwraca 1 dla zrównoważenia w nawiasach, 0 dla niezrównoważenia w nawiasach.
Wypróbuj online!
Rekurencyjny, 46 bajtów
Ten generuje błąd rekurencji dla niezrównoważonego w nawiasach:
Wypróbuj online!
źródło
x[k]
początkowo jest niezdefiniowany ix[k]++
dałbyNaN
, a-~undefined
daje1
.a[k]
początkowo zawiera znak. Ale ta sama logika dotyczy ciągów: zastosowanie++
na nich operatora dajeNaN
, ale operatory bitowe (takie jak~
) zmuszają je do0
wcześniejszego przymusu .Perl 6 ,
43 4137 bajtówSprawdź to
Sprawdź to
Sprawdź to
Rozszerzony:
źródło
R , 71 bajtów
Wypróbuj online!
Kolejne - dłuższe - rozwiązanie, ale interesujące dla innego podejścia
R , 85 bajtów
Wypróbuj online!
Objaśnienie:
Weź ciąg wejściowy i zamienia:
następnie ocenia wynikowe wyrażenie. Jeśli jest równa zero, jest zrównoważony, w przeciwnym razie nie jest. Użycie komendy
sum
jest konieczne tylko do obsługi pustej wielkości ciągu, ponieważ zwraca ona swoją ocenęNULL
.na przykład
źródło
f=function(s,r=sub('(()())','()',s,f=T))'if'(r==s,s==''|s=='()()',f(r))
Wolfram Language (Mathematica) , 65 bajtów
Wypróbuj online!
źródło
05AB1E ,
181613 bajtówPort odpowiedzi Japt @ETHproductions, aby naprawić przypadek testowy
()(()()(()())(()()))
.-2 bajty dzięki @Adnan .
Na podstawie tego komentarza OP używam teraz
()
jako prawdziwej wartości, a wszystko inne jako falsey. Jeśli obie wartości muszą być spójne zamiast tylko jednej, byłaby to stara 16- bajtowa odpowiedź zamiast (…(ÿ)…(()∞„()©:®Q
), zwracająca się w0
przypadku prawdomównych i1
testowych falsey.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
(Stara 18-bajtowa odpowiedź, która nie powiodła się w przypadku testowym
()(()()(()())(()()))
..):Wypróbuj online lub sprawdź wszystkie przypadki testowe .
źródło
„()∞õ:g_
.(()()()())
które powinny zwrócić falsey. Każda grupa w nawiasach powinna zawierać dokładnie 0 lub 2 grupy wewnętrzne.'(®')J
z…(ÿ)
.ÿ
, że istnieje, ale nigdy wcześniej go nie użyłem, więc zupełnie o nim zapomniałem.APL (Dyalog Classic) , 27 bajtów
Wypróbuj online!
źródło
Prolog , 46 bajtów
Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe!
Używa list
l
ir
jako danych wejściowych, np."()()"
Jest testowany jakof([l,r,l,r]).
.Pierwsze trzy wiersze to gramatyka prawidłowych ciągów w składni gramatyki Prologa.
a(A,B).
zwraca wartość,true
gdyA
lista jest zgodna z gramatyką iB
jest pusta. Tak więc główna funkcjaf
pobiera niektóreX
i sprawdza, czy jesta(X,[])
wstrzymana.źródło
Python 2 ,
7371 bajtówWypróbuj online!
źródło
pieprzenie mózgu, 50 bajtów
Sformatowany:
Oczekuje ciągu
(
i)
bez znaku nowej linii oraz danych wyjściowych\x01
dla wartości true i\x00
false. (Dla czytelności możesz np. Dodać 48+
s przed finałem,.
aby wydrukować1
i0
zamiast tego.)Wypróbuj online
Utrzymuje to stos z liczbą grup na każdej głębokości, rozróżniając znaki według parzystości i sprawdzając, czy liczba grup jest w {0, 2} po każdym zamkniętym nawiasie; jeśli warunek nie jest spełniony, zużywa resztę danych wejściowych i ustawia flagę; następnie sprawdza warunek ponownie pod koniec programu.
Jeśli wolno nam zakończyć strumień wejściowy nieparzystym znakiem, możemy pominąć kontrolę końcową,
<[--[>->]]
aby zapisać 10 bajtów. (Gdyby\n
nie było nawet niewygodnie, mógłbym zaproponować ten wariant jako główną odpowiedź).(Możemy również zapisać niektóre bajty, zmieniając format wyjściowy
\x00
na true i non-\x00
false, co wydaje się być dozwolone (być może przypadkowe) w opisie problemu w formie pisemnej, ale i tak nie byłoby to zbyt interesujące, a ja wolę nie wprowadzać tej zmiany).źródło
Python2,
9594 bajtówWypróbuj online!
f () przekształca ciąg w zagnieżdżoną krotkę, którą przekazuje do g ().
g () rekurencyjnie nawiguje po krotce i zwraca False, jeśli jakikolwiek element nie ma dokładnie 0 lub 2 elementów potomnych.
Zapisano jeden bajt przy użyciu formatowania ciągów.
źródło
Stax ,
1311 bajtówUruchom i debuguj
Zapisałem dwa bajty, kiedy zdałem sobie sprawę, że dane wejściowe można przypadkowo przywołać jako literały tablicowe. Usunięcie podwójnych cudzysłowów ułatwia wprowadzanie danych.
Ogólna idea polega na ewaluacji danych wejściowych jako literału tablicowego i rekurencyjnym mapowaniu elementów w celu sprawdzenia parethely balance. Jeśli ostateczne stwierdzenie kiedykolwiek się nie powiedzie, nastąpi kolejny pop na pustym stosie. W stax, opróżnianie pustych stosów natychmiast kończy program.
Rozpakowane, niepolowane i skomentowane, wygląda to tak.
Uruchom ten
źródło
Java 10,
99969583 bajtówPort mojej odpowiedzi 05AB1E (więc zwraca również
()
jako prawdę, a wszystko inne jako falsey).Wypróbuj online.
Wyjaśnienie:
return s;
może być,return"()".equals(s);
jeśli wymagany był rzeczywisty wynik logiczny.źródło
!s.contains("()()(")