Na tej stronie znajduje się kilka pytań dotyczących równoważenia nawiasów i sprawdzania, czy nawiasy są zrównoważone. Proponuję, że teraz nadszedł czas, aby użyć tych zrównoważonych nawiasów do czegoś!
W matematyce i programowaniu nawiasy kwadratowe są jak bańki, izolując wszystko w środku od wszystkiego na zewnątrz, dzięki czemu wszystko, co jest w środku, może robić swoje w spokoju, a wszystko na zewnątrz widzi tylko jeden obiekt. Jednak ciąg nawiasów jest jednowymiarowy, podczas gdy bąbelki zwykle są co najmniej dwuwymiarowe. Oznacza to, że bąbelki mogą się swobodnie przemieszczać wokół siebie, o ile nigdy się nie dotykają ani nie przechodzą między wnętrzem a zewnętrzem innych pęcherzyków.
Wyzwanie
Dane wejściowe to ciąg pasujących nawiasów pojedynczego typu, okrągłych ()
, kwadratowych []
, kręconych {}
lub kątowych <>
. Od Ciebie zależy, jaki program chcesz zaakceptować, a program, który akceptuje tylko jeden rodzaj nawiasów, jest akceptowany. (Imaginacyjny bonus, jeśli twój program może obsłużyć którykolwiek z nich, ogromne wymyślone punkty bonusowe, jeśli może obsłużyć je wszystkie na tym samym wejściu.) Dane wejściowe nie mogą zawierać niczego między nawiasami, chociaż dozwolone są końcowe białe spacje.
Wyjściem są wszystkie możliwe reorganizacje (w dowolnej kolejności, w tym oryginalne dane wejściowe) tych nawiasów, które dają tę samą konfigurację bąbelków, bez dwóch identycznych ciągów. Oznacza to, że przy wejściu ()()
wartość wyjściowa jest również sprawiedliwa ()()
, chociaż technicznie są to dwa bąbelki, które mogłyby zamieniać się miejscami. W przypadku ogromnej wymyślonej premii wejście {}[]()
woli prowadzi oczywiście do uzyskania 6 różnych elementów / ciągów / linii.
Dwie konfiguracje bąbelków są „takie same”, jeśli możesz zrobić jeden do drugiego, przesuwając bąbelki, nie pozwalając, aby jakikolwiek bąbelek przeciął się z innego bąbla na zewnątrz lub z zewnątrz do wewnątrz. Jeśli porównasz zagnieżdżone nawiasy do drzew (każda dopasowana para jest jednym węzłem, a każda dopasowana para w obrębie jest podwęzłem, a każda dopasowana para w obrębie jest ponownie podwęzłem itd.), Gdzie uporządkowane są podwęzły dowolnego danego węzła , wówczas pojedyncza konfiguracja bąbelków to drzewo, w którym węzły są nieuporządkowane.
Dowolny rozsądny format wyjściowy, na przykład zwrócenie listy ciągów znaków lub listy pojedynczych znaków lub pojedynczego ciągu znaków z pewnego rodzaju białymi spacjami , lub drukowanie do stdout
lub stderr
z jakąś formą widocznych białych znaków (najczęściej nowa linia lub spacja) pomiędzy każda reorganizacja.
Końcowe spacje dla każdej reorganizacji oraz końcowe i poprzedzające elementy nowej linii / pustej listy przed i po dozwoleniu rzeczywistych wyników. Powinieneś używać tego samego rodzaju nawiasów wyjściowych, co akceptujesz w danych wejściowych. Poza nawiasami, znakami nowej linii i spacjami, jak określono tutaj, i niezależnie od użytego separatora, nic nie powinno być drukowane (w tym znaki niewidoczne / o zerowej szerokości).
Wynik to liczba bajtów w kodzie; najniższa liczba wygranych dla każdego języka. Możesz zauważyć, czy otrzymasz wymyśloną premię, zwykłą czy ogromną, ale nie wpływa to na twój wynik. Rzeczywiste bonusy są zbyt trudne do zrównoważenia.
Przykłady przepływów międzygałęziowych
Przykład 1:
Wkład:
()(())
Wydajność:
()(())
(())()
Przykład 2:
Wkład:
(()())()()
Wydajność:
(()())()()
()(()())()
()()(()())
Przykład 3:
Wkład:
(()(()))()
Wydajność:
((())())()
()((())())
(()(()))()
()(()(()))
((()))
w przykładzie 1? czy()()()
? Wygląda na to, że brakuje Ci permutacji dla każdego wejścia.Odpowiedzi:
CJam , 18 bajtów
Wypróbuj online!
-2 dzięki Business Cat .
Odbiera dane wejściowe jako ciąg zawierający tylko
[]
. Zwraca listę permutacji (puste listy są takie same jak puste ciągi w CJam, więc zamiast tego[]
będziesz otrzymywać""
).źródło
[][]
just""
? - Czy dane wejściowe powinny być zawarte w dodatkowym zestawie[]
? Jeśli tak, dlaczego istnieje dodatkowy zestaw[]
wokół tego, co (być może?) Jest wyjściem dla wyżej wspomnianego przykładu? Pytanie brzmi również: „Powinieneś używać tego samego rodzaju nawiasów w danych wyjściowych, jak akceptujesz w danych wejściowych. Oprócz nawiasów, znaków nowej linii i spacji, jak określono tutaj, i niezależnie od użytego separatora, nic nie powinno być drukowane”, więc „ Nie jestem pewien, czy połączenie[]
i""
jest dopuszczalne.[][]
dodatkową parę[]
. Dla innych nie jestem pewien, czy są nieważni._{{B}%e!}&
zamiast_!!{{B}%e!}*
&
zwarcie czy coś takiego?&
uruchamia blok tylko wtedy, gdy inna wartość jest prawdziwaHaskell ,
227210208205 bajtówWypróbuj online!
Ten był trudny!
Trochę grałem w golfa
Zaoszczędzono dwa bajty dzięki Laikoni
Zaoszczędź dwa bajty dzięki Bruce Forte
Nie jestem pewien, czy to działa w każdym przypadku. Kilka wyjaśnień:
a!x
dodaj ciągx
do ostatniej listy ciągu wa
(a jest typu[[String]]
)snd$foldl(\(a,r)x->if x=='('then(a+1,last$(r++[[]]):[r!x|a>0])else(a-1,last$r:[r!x|a>1])
używa krótszego warunku do wyrażenia prostej idei: podziel ciąg na root)(
. Np ."(()(()))()"
Daje["()(())", ""]
.Musimy przetworzyć każdą część podziału, a następnie zebrać i połączyć wszystkie ciągi, aby uzyskać poprawny wynik:
h
przetwarza listę części: dotyczyv
pierwszej części i łączy wynik z procesem pozostałych części.v
agreguje wyniki dla każdej permutacji części i usuwa duplikaty.Aby dodać szerszy widok: masz w zasadzie drzewo (nie binarne) z pustymi węzłami. Zostaw to
()
. Musisz wygenerować wszystkie permutacje gałęzi dla każdego węzła, ale nie możesz pobrać gałęzi z węzła i umieścić go w innym węźle. Najpierw przeprowadziłem coś w rodzaju głębokości.źródło
init a
.Python 2,
353350331 bajtówOdbiera ciąg
()
wejściowy i wyświetla wynik.Wypróbuj tutaj!
Unikałem korzystania
itertools.permutations
z pomocy Paolo w odpowiedzi na to pytanie .Dziękujemy Business Cat za znalezienie 3 bajtów i dziękuję Panu Xcoder za niewiarygodne 19 bajtów!
Wyjaśnienie
()
pary w ciągu wejściowym.()
parą.źródło
print
i w miejscach takich jaki+1 if
(może byći+1if
). Również w jednym miejscu możeszy[0:i]
pominąć 0.JavaScript (Firefox 30-57), 222 bajty
Bierze
[]
sznurki. Wyjaśnienie:źródło
Mathematica, 337 bajtów
Nie po to, żeby zdobyć punkty do gry w golfa, ale by pokazać wykorzystanie
Permutations
iDistribute
w tym problemie. Mogą być jednak lepsze podejścia.(
seq
: sekwencja,alt
alternatywy)Weź dane jako ciąg znaków, używając nawiasów klamrowych
{
i}
. Wyjście ciągu wieloliniowego.źródło