此挑战是2018年4月LotM挑战以及Brain-flak 2岁生日的一部分
我在考虑编码Flask程序的最有效方法是什么。由于只有8个有效字符,因此显而易见的事情是将每个字符映射到3位序列。这肯定是非常有效的,但是仍然很多余。我们可以利用脑剥落代码的某些功能来缩短编码。
全部由2个匹配的方括号表示的nilads实际上充当单个信息单元,而不是2。如果我们用单个字节字符替换每个方括号,这将使编码小得多而不会丢失任何数据。
这个不太明显,但是monad 的结束字节也是多余的。您认为您可以猜出
'?'
以下代码段中的字符代表什么吗?{(({}?<>?<>?
如果我们假设输入的内容是有效的大脑标志,那么每个问号只有一个选项。这意味着我们可以明确地使用close monad字符来表示每个结束括号。这具有使字符集保持较小的附加好处,如果我们想使用霍夫曼编码,这将大有帮助。由于接近的monad字符很可能会成为最常见的字符,因此可以用一点来表示,这非常有效。
这两个技巧将使我们通过以下算法来压缩脑筋代码:
用替换monad的每个右括号
|
。换句话讲,将每个未在开头匹配之前的右方括号替换为小节。所以...(({})<(()()())>{})
会成为
(({}|<(()()()||{}|
用它的封闭支架替换所有的尼拉丁。因此,其中没有任何内容的匹配方括号将使用以下映射:
() --> ) {} --> } [] --> ] <> --> >
现在我们的最后一个示例变为:
((}|<()))||}|
删除尾随
|
字符。因为我们知道小节的总数应等于({[<
字符总数,所以如果末尾缺少小节,我们可以推断出它们。因此,例如:({({})({}[()])})
会成为
({(}|(}[)
今天的挑战是逆转这一过程。
给定一串只包含字符的压缩后的Flask,将其(){}[]<>|
扩展为原始的Flak代码。您可以假设输入将始终扩展为有效的大脑标志。这意味着输入的前缀中|
最多不会包含({[<
字符。
输入将不包含结尾|
字符。这些必须从上下文中推断出来。
与往常一样,您可以提交完整的程序或函数,并且输入/输出格式是允许的。并且由于这是一个代码高尔夫,因此您的代码将按源代码的长度(以字节为单位)进行评分,分数越小越好。
测试用例
这是一些测试用例。如果您想要更多,可以使用此python脚本和Brain-Flak Wiki生成自己的测试用例,这是大多数测试用例的来源。
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}