Tantangan ini diposting sebagai bagian dari tantangan LotM April 2018 , serta untuk ulang tahun 2nd Brain-flak
Saya sedang berpikir tentang apa cara paling efisien untuk menyandikan program brain-flak. Hal yang jelas harus dilakukan, karena hanya ada 8 karakter yang valid, adalah memetakan setiap karakter ke urutan 3-bit. Ini tentu sangat efektif, tetapi masih sangat berlebihan. Ada beberapa fitur kode brain-flak yang dapat kita manfaatkan untuk mempersingkat pengodean.
Nilad, yang semuanya diwakili oleh 2 tanda kurung yang cocok, benar-benar bertindak sebagai satu unit informasi daripada 2. Jika kita mengganti setiap braket dengan karakter byte tunggal, ini akan membuat pengkodean jauh lebih kecil tanpa kehilangan data.
Yang ini kurang jelas, tetapi byte penutup dari monad juga berlebihan. Pikirkan Anda dapat menebak apa yang
'?'
dilambangkan karakter dalam cuplikan berikut?{(({}?<>?<>?
Jika kita asumsikan inputnya adalah kode anti-otak yang valid, maka hanya ada satu opsi untuk masing-masing tanda tanya itu. Ini berarti bahwa kita dapat menggunakan karakter close monad untuk mewakili setiap braket penutup. Ini memiliki manfaat tambahan menjaga karakter tetap kecil, yang akan sangat membantu jika kita ingin menggunakan pengodean huffman. Karena karakter monad dekat kemungkinan besar akan menjadi karakter paling umum dengan margin lebar, itu bisa diwakili oleh bit tunggal, yang sangat efisien.
Dua trik ini akan memungkinkan kita memampatkan kode brain-flak melalui algoritma berikut:
Ganti setiap braket penutup dari monad dengan
|
. Atau dengan kata lain, ganti setiap braket penutup yang tidak didahului dengan pertandingan pembuka dengan bilah. Begitu...(({})<(()()())>{})
akan menjadi
(({}|<(()()()||{}|
Ganti setiap nilad dengan braket penutupnya. Karenanya, kurung yang cocok dengan tidak ada di dalamnya menggunakan pemetaan berikut:
() --> ) {} --> } [] --> ] <> --> >
Sekarang contoh terakhir kita menjadi:
((}|<()))||}|
Hapus
|
karakter tambahan. Karena kita tahu bahwa jumlah total bar harus sama dengan jumlah({[<
karakter, jika ada bar pada akhirnya hilang, kita dapat menyimpulkannya. Jadi contohnya seperti:({({})({}[()])})
akan menjadi
({(}|(}[)
Tantangan Anda untuk hari ini adalah membalikkan proses ini.
Diberikan string brain-flak terkompresi yang hanya berisi karakter (){}[]<>|
, memperluasnya ke kode brain-flak asli. Anda dapat mengasumsikan bahwa input akan selalu berkembang menjadi brain-flak yang valid. Ini berarti bahwa tidak ada awalan input yang akan mengandung lebih |
dari ({[<
karakter.
Input tidak akan mengandung |
karakter tambahan. Ini harus disimpulkan dari konteks.
Seperti biasa, Anda dapat mengirimkan program atau fungsi lengkap, dan format input / output permisif. Dan karena ini adalah kode-golf , kode Anda akan dinilai oleh panjang kode sumber dalam byte, semakin kecil skor semakin baik.
Uji kasus
Berikut ini beberapa test case. Jika Anda menginginkan lebih, Anda dapat membuat kotak uji Anda sendiri dengan skrip python ini dan Brain-Flak Wiki , yang merupakan asal sebagian besar kotak uji ini.
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}