Pertanyaan ini adalah yang kedua dari beberapa tantangan Ulang Tahun Brain-flak yang dirancang untuk merayakan Ulang Tahun pertama Brain-Flak! Anda dapat menemukan informasi lebih lanjut tentang Ulang Tahun Brain-Flak di sini
Tantangan
Untuk tantangan ini, Anda akan menghasilkan semua string yang sepenuhnya cocok dari daftar tanda kurung. Untuk meminjam definisi DJMcMayhem tentang string yang sepenuhnya cocok:
Untuk tujuan tantangan ini, "braket" adalah salah satu karakter:
()[]{}<>
.Sepasang tanda kurung dianggap "cocok" jika tanda kurung buka dan tutup berada dalam urutan yang benar dan tidak memiliki karakter di dalamnya, seperti
() []{}
Atau jika setiap subelemen di dalamnya juga cocok.
[()()()()] {<[]>} (()())
Subelemen juga dapat disarungkan beberapa lapisan.
[(){<><>[()]}<>()] <[{((()))}]>
Sebuah string dianggap "Sepenuhnya cocok" jika dan hanya jika setiap pasangan braket memiliki braket pembuka dan penutup yang benar dalam urutan yang benar.
Memasukkan
Program atau fungsi Anda akan mencatat empat angka non-negatif dalam format apa pun yang nyaman dan konsisten. Ini termasuk (tetapi tidak terbatas pada) daftar bilangan bulat, string dibatasi non-digit, atau argumen terpisah. Keempat angka ini mewakili jumlah pasangan yang cocok dari setiap jenis braket. Sebagai contoh, [1,2,3,4]
akan mewakili:
1 pasang
()
2 pasang
{}
3 pasang
[]
dan4 pasang
<>
Anda dapat memilih pasangan kurung yang sesuai dengan masing-masing input selama konsisten.
Keluaran
Anda harus menampilkan semua string yang sepenuhnya cocok yang dapat dibentuk dari daftar kurung ini tanpa duplikat. Output dapat dalam format wajar apa pun yang mencakup pencetakan string yang dibatasi non-braket ke STDOUT, atau daftar string sebagai nilai balik dari suatu fungsi.
Algoritma Anda harus bekerja untuk setiap masukan sewenang-wenang, tetapi Anda tidak perlu khawatir tentang memori, waktu atau batas ukuran bilangan bulat (misalnya jika jawaban Anda adalah di C Anda tidak akan mendapatkan 2 33 sebagai input).
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Contoh Input dan Output
Untuk contoh ini saya akan menggunakan urutan input yang sama seperti di atas.
Untuk setiap contoh, baris pertama akan menjadi input dan baris berikut akan menjadi output
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]
(){}[]<> (){}[<>] (){}<[]> (){}<>[] (){[]}<> (){[]<>} (){[<>]}
(){<[]>} (){<>}[] (){<>[]} ()[{}]<> ()[{}<>] ()[{<>}] ()[]{}<>
()[]{<>} ()[]<{}> ()[]<>{} ()[<{}>] ()[<>{}] ()[<>]{} ()<{}[]>
()<{}>[] ()<{[]}> ()<[{}]> ()<[]{}> ()<[]>{} ()<>{}[] ()<>{[]}
()<>[{}] ()<>[]{} ({})[]<> ({})[<>] ({})<[]> ({})<>[] ({}[])<>
({}[]<>) ({}[<>]) ({}<[]>) ({}<>)[] ({}<>[]) ({[]})<> ({[]}<>)
({[]<>}) ({[<>]}) ({<[]>}) ({<>})[] ({<>}[]) ({<>[]}) ([{}])<>
([{}]<>) ([{}<>]) ([{<>}]) ([]){}<> ([]){<>} ([])<{}> ([])<>{}
([]{})<> ([]{}<>) ([]{<>}) ([]<{}>) ([]<>){} ([]<>{}) ([<{}>])
([<>{}]) ([<>]){} ([<>]{}) (<{}[]>) (<{}>)[] (<{}>[]) (<{[]}>)
(<[{}]>) (<[]{}>) (<[]>){} (<[]>{}) (<>){}[] (<>){[]} (<>)[{}]
(<>)[]{} (<>{})[] (<>{}[]) (<>{[]}) (<>[{}]) (<>[]){} (<>[]{})
{()}[]<> {()}[<>] {()}<[]> {()}<>[] {()[]}<> {()[]<>} {()[<>]}
{()<[]>} {()<>}[] {()<>[]} {([])}<> {([])<>} {([]<>)} {([<>])}
{(<[]>)} {(<>)}[] {(<>)[]} {(<>[])} {}()[]<> {}()[<>] {}()<[]>
{}()<>[] {}([])<> {}([]<>) {}([<>]) {}(<[]>) {}(<>)[] {}(<>[])
{}[()]<> {}[()<>] {}[(<>)] {}[]()<> {}[](<>) {}[]<()> {}[]<>()
{}[<()>] {}[<>()] {}[<>]() {}<()[]> {}<()>[] {}<([])> {}<[()]>
{}<[]()> {}<[]>() {}<>()[] {}<>([]) {}<>[()] {}<>[]() {[()]}<>
{[()]<>} {[()<>]} {[(<>)]} {[]()}<> {[]()<>} {[](<>)} {[]}()<>
{[]}(<>) {[]}<()> {[]}<>() {[]<()>} {[]<>()} {[]<>}() {[<()>]}
{[<>()]} {[<>]()} {[<>]}() {<()[]>} {<()>}[] {<()>[]} {<([])>}
{<[()]>} {<[]()>} {<[]>()} {<[]>}() {<>()}[] {<>()[]} {<>([])}
{<>}()[] {<>}([]) {<>}[()] {<>}[]() {<>[()]} {<>[]()} {<>[]}()
[(){}]<> [(){}<>] [(){<>}] [()]{}<> [()]{<>} [()]<{}> [()]<>{}
[()<{}>] [()<>{}] [()<>]{} [({})]<> [({})<>] [({}<>)] [({<>})]
[(<{}>)] [(<>){}] [(<>)]{} [(<>{})] [{()}]<> [{()}<>] [{()<>}]
[{(<>)}] [{}()]<> [{}()<>] [{}(<>)] [{}]()<> [{}](<>) [{}]<()>
[{}]<>() [{}<()>] [{}<>()] [{}<>]() [{<()>}] [{<>()}] [{<>}()]
[{<>}]() [](){}<> [](){<>} []()<{}> []()<>{} []({})<> []({}<>)
[]({<>}) [](<{}>) [](<>){} [](<>{}) []{()}<> []{()<>} []{(<>)}
[]{}()<> []{}(<>) []{}<()> []{}<>() []{<()>} []{<>()} []{<>}()
[]<(){}> []<()>{} []<({})> []<{()}> []<{}()> []<{}>() []<>(){}
[]<>({}) []<>{()} []<>{}() [<(){}>] [<()>{}] [<()>]{} [<({})>]
[<{()}>] [<{}()>] [<{}>()] [<{}>]() [<>(){}] [<>()]{} [<>({})]
[<>{()}] [<>{}()] [<>{}]() [<>](){} [<>]({}) [<>]{()} [<>]{}()
<(){}[]> <(){}>[] <(){[]}> <()[{}]> <()[]{}> <()[]>{} <()>{}[]
<()>{[]} <()>[{}] <()>[]{} <({})[]> <({})>[] <({}[])> <({[]})>
<([{}])> <([]){}> <([])>{} <([]{})> <{()}[]> <{()}>[] <{()[]}>
<{([])}> <{}()[]> <{}()>[] <{}([])> <{}[()]> <{}[]()> <{}[]>()
<{}>()[] <{}>([]) <{}>[()] <{}>[]() <{[()]}> <{[]()}> <{[]}()>
<{[]}>() <[(){}]> <[()]{}> <[()]>{} <[({})]> <[{()}]> <[{}()]>
<[{}]()> <[{}]>() <[](){}> <[]()>{} <[]({})> <[]{()}> <[]{}()>
<[]{}>() <[]>(){} <[]>({}) <[]>{()} <[]>{}() <>(){}[] <>(){[]}
<>()[{}] <>()[]{} <>({})[] <>({}[]) <>({[]}) <>([{}]) <>([]){}
<>([]{}) <>{()}[] <>{()[]} <>{([])} <>{}()[] <>{}([]) <>{}[()]
<>{}[]() <>{[()]} <>{[]()} <>{[]}() <>[(){}] <>[()]{} <>[({})]
<>[{()}] <>[{}()] <>[{}]() <>[](){} <>[]({}) <>[]{()} <>[]{}()
Jawaban:
Haskell , 128 byte
f
adalah fungsi utama, dibutuhkan daftarInt
s dan mengembalikan daftarString
s.Cobalah online!
Bagaimana itu bekerja
f
mengubah daftar inputnya menjadi daftar daftar tupel, masing-masing tupel berisi sepasang braket, dengan masing-masing jenis braket di sublistnya sendiri. Misalnya[1,2,0,0]
menjadi[[('{','}')],[('[',']'),('[',']')]]
. Kemudian ia memanggilg
dengan daftar yang diubah.c
mengambil daftar daftarl
tuple braket yang tersisa dan mengembalikan daftar string yang mungkin untuk di-suffix ke apa yang sudah dihasilkan.g l
menghasilkan daftar string sepenuhnya cocok dapat dibentuk dengan menggunakan semua tanda kurung dil
.l#g
untuk menghasilkan string yang dimulai dengan beberapa braket.g
Parameter rekursif itu sendiri digunakan sebagai kelanjutan oleh#
, untuk menghasilkan apa yang muncul setelah subelemen kurung pertama.l
tidak memiliki tanda kurung di dalam)g
sebagai gantinya kembali[""]
, daftar berisi hanya string kosong. Karena[""]
membandingkan lebih kecil dengan semua daftar kosong yang dapat dihasilkan oleh#
, kita dapat melakukan ini dengan menerapkanmax
.l#c
menghasilkan string daril
awal dengan setidaknya satu subelemen kurung, membiarkan kelanjutanc
untuk menentukan apa yang mengikuti elemen.b
dane
merupakan pasangan kurung terpilih dalam tupelx
, danr
merupakan daftar tupel yang tersisa dari jenis braket yang sama.r:filter(/=x:r)l
adalahl
dengan tupelx
dihapus, sedikit disusun ulang.?
dipanggil untuk menghasilkan subelemen yang mungkin antarab
dane
. Ia mendapatkan kelanjutannya sendirimap(e:).c
, yang awalane
untuk setiap string sufiks yang dihasilkan olehc
.#
itu sendiri menambahkan awalb
untuk semua string yang dihasilkan oleh?
danc
.l?c
menghasilkan string yang sepenuhnya cocok yang dapat dibentuk dengan menggunakan nol atau lebih pasang braket daril
, dan kemudian melanjutkanc
ke kelanjutannya untuk menangani apa yang tersisa. Bagianc l
berjalan langsung kec
tanpa menambahkan subelemen apa pun, sementaral#(?c)
menggunakan#
untuk menghasilkan satu subelemen dan kemudian memanggil(?c)
secara rekursif untuk kemungkinan yang lebih lanjut.sumber
Jelly ,
50 4034 byte-6 byte terima kasih kepada Leaky Nun (mendapatkan pengurangan untuk bekerja di tempat saya tidak bisa)
Polos dan tidak efisien.
Cobalah online! (waktu habis di TIO untuk [1,1,1,1] - ya, tidak efisien.)
Bagaimana?
Secara rekursif menghilangkan pasangan kurung yang cocok yang berada tepat di sebelah satu sama lain sampai tidak ada lagi yang dapat dihapus untuk setiap string yang mungkin terbentuk, menjaga string tersebut yang tidak berkurang (sehingga memiliki semua konten yang cocok).
sumber
œṣ
-F
-µÐL
dalam masalah yang agak terkait .Pyth -
83747163 byteCobalah
1 : Kc "[] {} () <>") Fd {.ps * VR \ KQJdVldFHK =: JHk)) I! Jd
Juga, versi 53-byte ini berkat Leaky Nun
Sini
sumber
("\[]""{}""\(\)""<>")
, kita lakukanc"\[] \{} \(\) <>")
(split pada spasi putih); alih-alih:@Kd*\\2k
, kami-@Kd
diikuti oleh dua backslash; kemudian, alih-alih memetakanU4
, kami melakukannya*V-R\\KQ
(mengalikan dua array secara paralel). Array pertama dibuat menggunakanR
, yaitu-R\\k
Ini akan memberi Anda versi 54-byte05AB1E ,
3332302725 byteDisimpan 7 byte berkat Riley .
Urutan input adalah
[(),<>,[],{}]
Cobalah online!
Penjelasan
sumber
:
vektorisasi (Anda dapat melewati sebagian besar dari loop tak terbatas). 2. Lebih pendek 1 byte untuk digunakanUX
di awal danX
ketika Anda membutuhkan daftar tanda kurung lagi.:
, tetapi kami mendapatkan masalah ketika misalnya penggantian pada{}
membuat kemungkinan penggantian()
karena kami sudah mencoba mengganti semua()
. Poin bagus tentang ituUX
. Kita bisa mendapatkan byte lain dengan©®
.U
muncul di puncak selalu membuat frustrasi. Saya tidak tahu©®
.[([]{})<{[()<()>]}()>{}]
, tetapi tidak untuk[({})<{[()<()>]}()>{}]
. Satu-satunya perbedaan adalah dihapus[]
. Saya akan menanyakannya di TNB.Ruby , 123 byte
Cobalah online! Ini tidak efisien, jadi input bahkan suka
[1,2,1,1]
kehabisan waktu online. Semua contoh yang terdaftar akan berfungsi, setidaknya!Penjelasan
sumber