Normalne wsporniki ( ()
, []
, <>
i {}
) są ładne i jednoznaczne, jednak ktoś myślał, że będzie to dobry pomysł, aby wykorzystać znaki spoza Wspornik nawiasach. Te znaki, |
i "
są niejednoznaczne. Na przykład robi
""""
odpowiada
(())
lub
()()
Nie da się powiedzieć.
Na przykład zaczyna się robić ciekawie, gdy zmieszamy typy niejednoznacznych nawiasów kwadratowych
"|""||""|"
Może to być dowolny z poniższych
([(([]))]),([()[]()]),([()][()])
Zadanie
Twoim zadaniem jest pobranie ciągu złożonego z niejednoznacznych znaków i wygenerowanie wszystkich możliwych zrównoważonych ciągów, które autor mógł zamienić.
Mówiąc dokładniej, wyprowadzasz wszystkie zbalansowane ciągi, które można wykonać zamieniając na |
jeden [
lub na ]
i na "
jeden (
lub )
. Nie powinieneś wyprowadzać żadnego zbalansowanego ciągu dwa razy.
IO
Jako dane wejściowe powinieneś wziąć ciąg składający się z |
i "
. Jeśli chcesz wybrać dwa różne znaki inne niż |
i "
służyć jako zamienniki, możesz to zrobić. Powinieneś wyprowadzić kontener zrównoważonych ciągów. Możesz wybrać, aby zastąpić []
i ()
na wyjściu z dwoma innymi parami wspornik ( ()
, []
, <>
lub {}
) chcesz. Twój format wyjściowy powinien być spójny między przebiegami.
Punktacja
To jest golf golfowy, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.
Przypadki testowe
"" -> ["()"]
"|"| -> []
||| -> []
"""" -> ["(())","()()"]
""|| -> ["()[]"]
"|"||"|" -> ["([([])])"]
"|""||""|" -> ["([(([]))])","([()[]()])","([()][()])"]
źródło
Odpowiedzi:
Python 2 , 135 bajtów
Wypróbuj online!
Oczekuje danych wejściowych takich jak
2002
zamiast"||"
i zawiniętych w cudzysłów.Iteruje wszystkie 2 N możliwych przypisań „open” i „close” do ciągu, tworząc ciągi
c
takie jak:Jeśli
eval
-ing ten ciąg zgłasza wyjątek, nie ma sobie równych. Jeśli nie, drukujemyc[::2]
, podając:źródło
Retina ,
595655 bajtówWypróbuj online! Niestety testowanie dwóch zestawów dopasowanych nawiasów przekracza golfowość pojedynczego wyrażenia regularnego .NET, więc oszczędza 15 bajtów do ręcznego sprawdzania. Edycja: Zapisano
34 bajty dzięki @ H.PWiz. Wyjaśnienie:Znajdź a
"
i zrób dwie kopie linii, jedną z<
a drugą z>
. Zrób to pojedynczo"
, aby każda z nich"
podwoiła liczbę linii.Podobnie z
'
,{
i}
. Następnie kontynuuj wymianę, dopóki wszystkie"
s i'
s na wszystkich kopiach nie zostaną wymienione.Zrób duplikat nawiasów rozdzielonych znakiem
_
.W duplikacie kilkakrotnie usuwaj dopasowane nawiasy, aż nie pozostaną żadne, w którym to przypadku również je usuń
_
.Usuń wszystkie linie, które nadal mają
_
.Retina ,
747170 bajtówWypróbuj online! Objaśnienie: Pierwsze dwa etapy są takie jak powyżej. Trzeci etap drukuje bezpośrednio wynik dopasowania dwóch zestawów dopasowanych nawiasów. Wykorzystuje grupy równoważące .NET. Na każdym etapie dopasowania wyrażenie regularne próbuje dopasować znak, a następnie spojrzeć wstecz na parę pasujących nawiasów, a następnie sprawdzić, czy góra stosu odpowiada otwartemu nawiasowi. Jeśli może to zrobić, oznacza to, że wspornik równoważy się, a otwarty wspornik wyskakuje ze stosu. W przeciwnym razie założymy, że mamy otwarty nawias, który należy zepchnąć na stos. Jeśli te założenia się nie sprawdzą, stos nie będzie pusty na końcu i dopasowanie się nie powiedzie.
Alternatywne podejście, także
7471 bajtów:Tutaj patrzymy w przyszłość albo
<
...>
albo{
...}
, a następnie patrzymy w tył, aby przesunąć wspornik zamykający na stos. W przeciwnym razie musimy dopasować i przełamać nawias zamykający, który przechwyciliśmy wcześniej. W tej wersji wyrażenie regularne może nawet nie dojść do końca łańcucha, ale niektóre łańcuchy, takie jak np.<<<>
Prześlizgnęłyby się przez sieć, gdybyśmy nie sprawdzili pustego stosu.źródło
|
dane wejścioweŁuska , 19 bajtów
Wypróbuj online! Wykorzystuje znaki
ds
na wejściu oraz odpowiednie pary nawiasówde
ist
na wyjściu.Wyjaśnienie
Chodzi o to, aby wygenerować wszystkie możliwe nawiasy klamrowe wejściowe i zachować te, które zmniejszają się do pustego ciągu, gdy wielokrotnie usuwamy sąsiednie nawiasy.
¨÷₂¨
Jest sprężony znaków, który rozszerza się"dest"
, który został wybrany, ponieważ ma postać krótkiego sprężonego i składa się z par znaków z sąsiadującymi codepoints. Program jest więc równoważny z poniższym.źródło
Perl,
565553 bajtówObejmuje
+1
dlan
zastosowania
[
dla[]
i{
dla{}
Generuje wszystkie możliwości 2 ^ N, a następnie używa perla,
eval
aby sprawdzić, czy ciąg taki jak „+ [+ {}]” jest poprawnym kodem, a jeśli tak, usuwa+
i drukuje wynikźródło
APL (Dyalog Classic) ,
5553 bajtówWypróbuj online!
źródło
Czysty ,
203186179 bajtówWypróbuj online!
Wykorzystuje tylko dopasowanie wzorca i rozumienie.
źródło
Perl, 56 bajtów
Obejmuje
+
dlan
Wykorzystuje dane wejściowe
[
dla wyjścia[
lub]
Wykorzystuje dane wejściowe
{
dla wyjścia{
lub}
Używa rozszerzonego wyrażenia regularnego w Perlu, aby dopasować nawiasy klamrowe, jednocześnie śledząc wybory dokonane podczas cofania. Może to być o wiele bardziej wydajne niż generowanie wszystkich kandydatów 2 ^ N, ponieważ już odrzuca wiele niemożliwych przypisań podczas przechodzenia przez ciąg wejściowy
źródło
Kotlin ,
240236234 bajtówUpiększony
Test
Edycje
true
->1>0
i== 0
->< 1
źródło
C (gcc) , 315 bajtów
Wypróbuj online!
C (gcc) , 334 bajty (stara wersja)
Wypróbuj online!
Objaśnienie (stara wersja)
Wypróbuj online!
źródło
*s++
w kilku miejscach.char S[n],*s=S
jest nadal krótszy niżchars*s=calloc(n,1)