Этот конкурс был опубликован в рамках конкурса LotM в апреле 2018 года , а также ко второму дню рождения Brain-flak
Я думал о том, каким будет наиболее эффективный способ кодирования программ мозговых атак. Очевидная вещь, которую нужно сделать, поскольку существует только 8 допустимых символов, состоит в том, чтобы сопоставить каждый символ с 3-битной последовательностью. Это, конечно, очень эффективно, но все равно очень избыточно. В коде мозгового штурма есть некоторые особенности, которые мы могли бы использовать для сокращения кодировки.
Нилады, которые все представлены в 2 совпадающих скобках, действительно действуют как единая единица информации, а не как 2. Если бы мы заменили каждую скобку однобайтовым символом, это сделало бы кодировки намного меньше без потери каких-либо данных.
Этот менее очевиден, но завершающие байты монад также избыточны. Думаю, вы могли догадаться, что
'?'
символы представляют в следующем фрагменте?{(({}?<>?<>?
Если мы предположим, что введенный код является допустимым кодом «мозгового штурма», то для каждого из этих вопросительных знаков будет только один вариант. Это означает, что мы можем однозначно использовать символ закрывающей монады для представления каждой закрывающей скобки. Это дает дополнительное преимущество, заключающееся в сохранении небольшого набора символов, что очень помогло бы, если бы мы хотели использовать кодировку Хаффмана. Поскольку символ закрытой монады , скорее всего, будет наиболее распространенным символом с большим отрывом, он может быть представлен одним битом, что чрезвычайно эффективно.
Эти два трюка позволят нам сжать код мозгового штурма с помощью следующего алгоритма:
Замените все закрывающие скобки монады на
|
. Или, другими словами, замените каждую закрывающую скобку, которой не предшествует ее открывающее совпадение, с чертой. Так...(({})<(()()())>{})
станет
(({}|<(()()()||{}|
Замените каждую ниладу закрывающей скобкой. Поэтому в сопоставленных скобках, в которых нет ничего, используется следующее сопоставление:
() --> ) {} --> } [] --> ] <> --> >
Теперь наш последний пример становится:
((}|<()))||}|
Удалить висячие
|
символы. Поскольку мы знаем, что общее количество баров должно равняться общему количеству({[<
символов, если в конце отсутствуют бары, мы можем вывести их. Итак, пример как:({({})({}[()])})
станет
({(}|(}[)
Ваша задача на сегодня - переломить этот процесс.
Получив цепочку сжатых мозговых злаков, содержащих только символы (){}[]<>|
, разверните ее в исходный код мозговых злаков. Вы можете предположить, что входные данные всегда будут расширяться до действительных умственных способностей. Это означает, что ни один префикс ввода никогда не будет содержать больше, |
чем ({[<
символы.
Ввод не будет содержать завершающие |
символы. Они должны быть выведены из контекста.
Как обычно, вы можете отправить либо полную программу, либо функцию, а форматы ввода / вывода допустимы. А поскольку это код-гольф , ваш код будет оцениваться по длине исходного кода в байтах, чем меньше оценка, тем лучше.
Контрольные примеры
Вот несколько тестов. Если вам нужно больше, вы можете сгенерировать свои собственные тестовые сценарии с помощью этого сценария Python и Brain-Flak Wiki , откуда и происходит большинство этих тестовых примеров.
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}