Цей виклик було розміщено як частина виклику LotM у квітні 2018 року , а також 2-го дня народження Brain-Flak
Я замислювався над тим, який би найефективніший спосіб кодування програм із заповненням мозку. Очевидно, що потрібно зробити, оскільки існує лише 8 дійсних символів, - це зіставлення кожного символу в 3-бітній послідовності. Це, звичайно, дуже ефективно, але все-таки дуже зайве. Існують деякі особливості кодового мозку, яким ми могли б скористатися, щоб скоротити кодування.
Нілади, які представлені двома відповідніми дужками, дійсно виступають як одна одиниця інформації, а не 2. Якби ми замінили кожну дужку одним байтовим символом, це зробить кодування значно меншими, не втрачаючи жодних даних.
Цей спосіб менш очевидний, але байти монад , що закриваються, також зайві. Думаєте, ви могли здогадатися, що
'?'
символи представляють у наступному фрагменті?{(({}?<>?<>?
Якщо ми вважаємо, що вхідний код є дійсним кодовим моментом, то для кожного з цих знаків питання існує лише один варіант. Це означає, що ми можемо однозначно використовувати близький символ монади для представлення кожної закриваючої дужки. Це має додаткову перевагу у збереженні набору символів невеликим, що дуже допоможе, якби ми хотіли використовувати кодування Хаффмана. Оскільки близький характер монади , швидше за все, буде найпоширенішим персонажем з широким відривом, він може бути представлений одним бітом, який є надзвичайно ефективним.
Ці два хитрощі дозволять нам стиснути код, що не відповідає мозку, за допомогою наступного алгоритму:
Замініть кожен закриваючий кронштейн монади на
|
. Або іншими словами, замінюйте кожну закриваючу кронштейн, якому не передує її відкриття, на брусок. Так...(({})<(()()())>{})
став би
(({}|<(()()()||{}|
Замініть кожну нижню частину її закриваючої дужки. Тому збірні дужки, в яких немає нічого, використовують наступне відображення:
() --> ) {} --> } [] --> ] <> --> >
Тепер наш останній приклад стає:
((}|<()))||}|
Видаліть
|
символи, що знаходяться в кінці . Оскільки ми знаємо, що загальна кількість барів повинна дорівнювати загальній кількості({[<
символів, якщо рядки в кінці відсутні, ми можемо їх зробити висновок. Отже, наприклад:({({})({}[()])})
став би
({(}|(}[)
Ваше сьогоднішнє завдання - це повернути цей процес.
Враховуючи рядок стисненого мозку, що містить лише символи (){}[]<>|
, розгорніть його у вихідний код головного мозку. Ви можете припустити, що вхід завжди буде розширюватися до дійсного мозку. Це означає , що ні один префікс введення ніколи не буде містити більш |
ніж ({[<
символи.
Вхід не буде містити |
символи, що тривають . Вони повинні бути виведені з контексту.
Як завжди, ви можете подати або повну програму, або функцію, а формати введення / виводу є дозволеними. А оскільки це код-гольф , ваш код буде набраний по довжині вихідного коду в байтах, чим менша оцінка, тим краще.
Тестові справи
Ось кілька тестових випадків. Якщо ви хочете більше, ви можете генерувати власні тестові випадки за допомогою цього сценарію python та Brain-Flak Wiki , звідки походить більшість цих тестових випадків.
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}