To pytanie jest drugim z kilku wyzwań urodzinowych Brain-flak zaprojektowanych z okazji pierwszych urodzin Brain-Flak! Więcej informacji na temat urodzin Brain-Flaka można znaleźć tutaj
Wyzwanie
Do tego wyzwania wygenerujesz wszystkie w pełni dopasowane ciągi z listy 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 można również zagnieżdżać 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.
Wejście
Twój program lub funkcja pobierze listę czterech liczb nieujemnych w dowolnym wygodnym, spójnym formacie. Obejmuje to (ale nie wyłącznie) listę liczb całkowitych, ciąg znaków nieprzekraczających cyfr lub oddzielne argumenty. Te cztery liczby reprezentują liczbę dopasowanych par każdego rodzaju wspornika. Na przykład [1,2,3,4]
reprezentowałby:
1 para
()
2 pary
{}
3 pary
[]
i4 pary
<>
Możesz wybrać, która para nawiasów odpowiada każdemu wejściu, o ile jest spójna.
Wynik
Powinieneś wypisać wszystkie w pełni dopasowane ciągi, które można utworzyć z tej listy nawiasów bez duplikatów. Dane wyjściowe mogą być w dowolnym rozsądnym formacie, który obejmuje wydrukowanie ciągów rozdzielanych bez nawiasów do STDOUT lub listy ciągów jako wartości zwracanej z funkcji.
Twój algorytm musi działać dla dowolnych dowolnych danych wejściowych, ale nie musisz się martwić limitami pamięci, czasu lub liczb całkowitych (np. Jeśli twoja odpowiedź jest w C, nie otrzymasz 2 33 jako danych wejściowych).
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Przykład wejścia i wyjścia
W tych przykładach użyję tej samej kolejności wprowadzania, jak powyżej.
Dla każdego przykładu zostanie wprowadzony pierwszy wiersz, a kolejne wiersze będą wynikiem
Example 0:
[0,0,0,0]
Example 1:
[1,0,0,0]
()
Example 2:
[0,2,0,0]
{}{}
{{}}
Example 3:
[0,0,1,1]
[]<>
[<>]
<[]>
<>[]
Example 4:
[0,1,2,0]
{}[][] {}[[]] {[]}[] {[][]} {[[]]}
[{}][] [{}[]] [{[]}] []{}[] []{[]}
[][{}] [][]{} [[{}]] [[]{}] [[]]{}
Example 5:
[1,0,0,3]
()<><><> ()<><<>> ()<<>><> ()<<><>> ()<<<>>> (<>)<><> (<>)<<>>
(<><>)<> (<><><>) (<><<>>) (<<>>)<> (<<>><>) (<<><>>) (<<<>>>)
<()><><> <()><<>> <()<>><> <()<><>> <()<<>>> <(<>)><> <(<>)<>>
<(<><>)> <(<<>>)> <>()<><> <>()<<>> <>(<>)<> <>(<><>) <>(<<>>)
<><()><> <><()<>> <><(<>)> <><>()<> <><>(<>) <><><()> <><><>()
<><<()>> <><<>()> <><<>>() <<()>><> <<()><>> <<()<>>> <<(<>)>>
<<>()><> <<>()<>> <<>(<>)> <<>>()<> <<>>(<>) <<>><()> <<>><>()
<<><()>> <<><>()> <<><>>() <<<()>>> <<<>()>> <<<>>()> <<<>>>()
Example 6:
[1,1,1,1]
(){}[]<> (){}[<>] (){}<[]> (){}<>[] (){[]}<> (){[]<>} (){[<>]}
(){<[]>} (){<>}[] (){<>[]} ()[{}]<> ()[{}<>] ()[{<>}] ()[]{}<>
()[]{<>} ()[]<{}> ()[]<>{} ()[<{}>] ()[<>{}] ()[<>]{} ()<{}[]>
()<{}>[] ()<{[]}> ()<[{}]> ()<[]{}> ()<[]>{} ()<>{}[] ()<>{[]}
()<>[{}] ()<>[]{} ({})[]<> ({})[<>] ({})<[]> ({})<>[] ({}[])<>
({}[]<>) ({}[<>]) ({}<[]>) ({}<>)[] ({}<>[]) ({[]})<> ({[]}<>)
({[]<>}) ({[<>]}) ({<[]>}) ({<>})[] ({<>}[]) ({<>[]}) ([{}])<>
([{}]<>) ([{}<>]) ([{<>}]) ([]){}<> ([]){<>} ([])<{}> ([])<>{}
([]{})<> ([]{}<>) ([]{<>}) ([]<{}>) ([]<>){} ([]<>{}) ([<{}>])
([<>{}]) ([<>]){} ([<>]{}) (<{}[]>) (<{}>)[] (<{}>[]) (<{[]}>)
(<[{}]>) (<[]{}>) (<[]>){} (<[]>{}) (<>){}[] (<>){[]} (<>)[{}]
(<>)[]{} (<>{})[] (<>{}[]) (<>{[]}) (<>[{}]) (<>[]){} (<>[]{})
{()}[]<> {()}[<>] {()}<[]> {()}<>[] {()[]}<> {()[]<>} {()[<>]}
{()<[]>} {()<>}[] {()<>[]} {([])}<> {([])<>} {([]<>)} {([<>])}
{(<[]>)} {(<>)}[] {(<>)[]} {(<>[])} {}()[]<> {}()[<>] {}()<[]>
{}()<>[] {}([])<> {}([]<>) {}([<>]) {}(<[]>) {}(<>)[] {}(<>[])
{}[()]<> {}[()<>] {}[(<>)] {}[]()<> {}[](<>) {}[]<()> {}[]<>()
{}[<()>] {}[<>()] {}[<>]() {}<()[]> {}<()>[] {}<([])> {}<[()]>
{}<[]()> {}<[]>() {}<>()[] {}<>([]) {}<>[()] {}<>[]() {[()]}<>
{[()]<>} {[()<>]} {[(<>)]} {[]()}<> {[]()<>} {[](<>)} {[]}()<>
{[]}(<>) {[]}<()> {[]}<>() {[]<()>} {[]<>()} {[]<>}() {[<()>]}
{[<>()]} {[<>]()} {[<>]}() {<()[]>} {<()>}[] {<()>[]} {<([])>}
{<[()]>} {<[]()>} {<[]>()} {<[]>}() {<>()}[] {<>()[]} {<>([])}
{<>}()[] {<>}([]) {<>}[()] {<>}[]() {<>[()]} {<>[]()} {<>[]}()
[(){}]<> [(){}<>] [(){<>}] [()]{}<> [()]{<>} [()]<{}> [()]<>{}
[()<{}>] [()<>{}] [()<>]{} [({})]<> [({})<>] [({}<>)] [({<>})]
[(<{}>)] [(<>){}] [(<>)]{} [(<>{})] [{()}]<> [{()}<>] [{()<>}]
[{(<>)}] [{}()]<> [{}()<>] [{}(<>)] [{}]()<> [{}](<>) [{}]<()>
[{}]<>() [{}<()>] [{}<>()] [{}<>]() [{<()>}] [{<>()}] [{<>}()]
[{<>}]() [](){}<> [](){<>} []()<{}> []()<>{} []({})<> []({}<>)
[]({<>}) [](<{}>) [](<>){} [](<>{}) []{()}<> []{()<>} []{(<>)}
[]{}()<> []{}(<>) []{}<()> []{}<>() []{<()>} []{<>()} []{<>}()
[]<(){}> []<()>{} []<({})> []<{()}> []<{}()> []<{}>() []<>(){}
[]<>({}) []<>{()} []<>{}() [<(){}>] [<()>{}] [<()>]{} [<({})>]
[<{()}>] [<{}()>] [<{}>()] [<{}>]() [<>(){}] [<>()]{} [<>({})]
[<>{()}] [<>{}()] [<>{}]() [<>](){} [<>]({}) [<>]{()} [<>]{}()
<(){}[]> <(){}>[] <(){[]}> <()[{}]> <()[]{}> <()[]>{} <()>{}[]
<()>{[]} <()>[{}] <()>[]{} <({})[]> <({})>[] <({}[])> <({[]})>
<([{}])> <([]){}> <([])>{} <([]{})> <{()}[]> <{()}>[] <{()[]}>
<{([])}> <{}()[]> <{}()>[] <{}([])> <{}[()]> <{}[]()> <{}[]>()
<{}>()[] <{}>([]) <{}>[()] <{}>[]() <{[()]}> <{[]()}> <{[]}()>
<{[]}>() <[(){}]> <[()]{}> <[()]>{} <[({})]> <[{()}]> <[{}()]>
<[{}]()> <[{}]>() <[](){}> <[]()>{} <[]({})> <[]{()}> <[]{}()>
<[]{}>() <[]>(){} <[]>({}) <[]>{()} <[]>{}() <>(){}[] <>(){[]}
<>()[{}] <>()[]{} <>({})[] <>({}[]) <>({[]}) <>([{}]) <>([]){}
<>([]{}) <>{()}[] <>{()[]} <>{([])} <>{}()[] <>{}([]) <>{}[()]
<>{}[]() <>{[()]} <>{[]()} <>{[]}() <>[(){}] <>[()]{} <>[({})]
<>[{()}] <>[{}()] <>[{}]() <>[](){} <>[]({}) <>[]{()} <>[]{}()
Odpowiedzi:
Haskell , 128 bajtów
f
jest główną funkcją, pobiera listęInt
s i zwraca listęString
s.Wypróbuj online!
Jak to działa
f
przekształca swoją listę wejściową w listę list krotek, każda krotka zawiera parę nawiasów, z każdym rodzajem nawiasu we własnej liście podrzędnej. Np .[1,2,0,0]
Staje się[[('{','}')],[('[',']'),('[',']')]]
. Następnie wywołujeg
z przekształconą listą.c
pobiera listęl
pozostałych krotek i zwraca listę możliwych ciągów znaków, które należy dodać do tego, co zostało już wygenerowane.g l
generuje listę w pełni dopasowanych ciągów, które można formować, używając wszystkich nawiasów wl
.l#g
generowanie ciągów zaczynających się od jakiegoś nawiasu. Samg
parametr rekurencyjny jest używany jako kontynuacja przez#
, do generowania tego, co następuje po pierwszym podelementie w nawiasach.l
nie ma w nich nawiasów),g
zwraca[""]
listę zawierającą tylko pusty ciąg. Ponieważ[""]
porównuje mniejsze do wszystkich niepustych list produkowanych przez#
, możemy to zrobić, stosującmax
.l#c
generuje łańcuchy odl
początku z co najmniej jednym podelementem w nawiasach, pozostawiając kontynuację wc
celu ustalenia, co następuje po elemencie.b
ie
są wybraną parą nawiasów w krotcex
, ir
jest listą pozostałych krotek tego samego typu nawiasów.r:filter(/=x:r)l
jestl
pox
usunięciu krotki , nieco przestawiony.?
jest wywoływany w celu wygenerowania możliwych podelementów międzyb
ie
. Pobiera własną kontynuacjęmap(e:).c
, która jest prefikseme
każdego generowanego ciągu sufiksówc
.#
sam dodaje inicjałb
do wszystkich ciągów wygenerowanych przez?
ic
.l?c
generuje w pełni dopasowane ciągi, które można formować przy użyciu zerowej lub większej liczby par nawiasówl
, a następnie pozostawia do kontynuacji,c
aby obsłużyć to, co zostało.c l
Część idzie bezpośrednioc
, bez dodawania żadnych podelementów, natomiastl#(?c)
zastosowania#
do generowania jeden podelement a następnie zadzwonić(?c)
rekursywnie dla ewentualnych dalszych nich.źródło
Galaretka ,
50 4034 bajtów-6 bajtów dzięki Leaky Nun (przejście do pracy tam, gdzie nie mogłem)
Prosty i nieefektywny.
Wypróbuj online! (przekroczenie limitu czasu w TIO dla [1,1,1,1] - tak, nieefektywne.)
W jaki sposób?
Rekurencyjnie usuwa pary pasujących nawiasów, które znajdują się obok siebie, dopóki nie będzie można usunąć więcej dla każdego możliwego łańcucha, który można utworzyć, zachowując takie łańcuchy, które redukują się do zera (stąd wszystkie pasujące treści).
źródło
œṣ
-F
-µÐL
w nieco powiązanym problemie .Pyth -
83747163 bajtówSpróbuj
1 : Kc "[] {} () <>") Fd {.ps * VR \ KQJdVldFHK =: JHk)) I! Jd
Również ta 53-bajtowa wersja dzięki Leaky Nun
Tutaj
źródło
("\[]""{}""\(\)""<>")
robimyc"\[] \{} \(\) <>")
(podział na białe znaki); zamiast:@Kd*\\2k
tego-@Kd
następuje dwa odwrotne ukośniki; następnie zamiast mapowaniaU4
robimy*V-R\\KQ
(mnożymy równolegle dwie tablice). Pierwsza tablica jest generowana przy użyciuR
, mianowicie-R\\k
To da ci 54-bajtową wersję05AB1E ,
3332302725 bajtówZaoszczędź 7 bajtów dzięki Riley .
Kolejność wprowadzania to
[(),<>,[],{}]
Wypróbuj online!
Wyjaśnienie
źródło
:
wektoryzacja (możesz pominąć większość nieskończonej pętli). 2. Jest o 1 bajt krótszy do użyciaUX
na początku iX
kiedy znów potrzebujesz listy nawiasów.:
początku, ale pojawiają się problemy, gdy na przykład wymiana na{}
tworzy możliwe wymiany,()
ponieważ próbowaliśmy już wymienić wszystkie()
. Dobra racjaUX
jednak. Możemy również uzyskać inny bajt©®
.U
wyskakuje na szczyt był zawsze frustrujący. Nie wiedziałam o tym©®
.[([]{})<{[()<()>]}()>{}]
, ale nie na[({})<{[()<()>]}()>{}]
. Jedyną różnicą jest usunięcie[]
. Zapytam o to w TNB.Rubin , 123 bajty
Wypróbuj online! Jest to jednak nieefektywne, więc nawet dane wejściowe przekroczą
[1,2,1,1]
limit czasu w Internecie. Przynajmniej wszystkie wymienione przykłady będą działać!Wyjaśnienie
źródło