このチャレンジは、2018年4月のLotMチャレンジの一部として、およびBrain-flakの2回目の誕生日に投稿されました
Brain-Flakプログラムをエンコードする最も効率的な方法は何かを考えていました。有効な文字は8つしかないため、行うべき明らかなことは、各文字を3ビットシーケンスにマップすることです。これは確かに非常に効果的ですが、それでも非常に冗長です。Brain-flakコードには、エンコードを短縮するために利用できる機能がいくつかあります。
ニラッドはすべて2つの一致するブラケットで表され、実際には2ではなく単一の情報単位として機能します。各ブラケットを1バイト文字に置き換えると、データを失うことなくエンコードがはるかに小さくなります。
これはそれほど明白ではありませんが、モナドの終了バイトも冗長です。
'?'
次のスニペットで文字が何を表すか推測できると思いますか?{(({}?<>?<>?
入力が有効なbrain-flakコードであると仮定した場合、それらの疑問符ごとに1つのオプションしかありません。これは、閉じるモナド文字を明確に使用して、すべての閉じ括弧を表すことができることを意味します。これには、文字セットを小さく保つという追加の利点があります。これは、ハフマンエンコーディングを使用する場合に非常に役立ちます。以来近いモナドの文字が最も可能性の高いワイドマージンによって最も一般的な文字になります、非常効率的である、単一ビットで表現することができます。
これらの2つのトリックにより、次のアルゴリズムを介してbrain-flakコードを圧縮できます。
モナドのすべての閉じ括弧をに置き換え
|
ます。または、言い換えると、開始一致の前にないすべての閉じ括弧をバーに置き換えます。そう...(({})<(()()())>{})
になるだろう
(({}|<(()()()||{}|
すべてのニラッドを閉じブラケットで置き換えます。したがって、何も含まれていない一致した括弧は、次のマッピングを使用します。
() --> ) {} --> } [] --> ] <> --> >
これで最後の例は次のようになります。
((}|<()))||}|
末尾の
|
文字を削除します。バーの総数は({[<
文字の総数と等しくなければならないことがわかっているため、最後にバーがない場合は推測できます。次のような例:({({})({}[()])})
になるだろう
({(}|(}[)
今日の課題は、このプロセスを逆にすることです。
文字のみを含む圧縮されたbrain-flakの文字列が与えられた(){}[]<>|
場合、元のbrain-flakコードに展開します。入力は常に有効なブレインフラックに拡張されると想定できます。これは、入力のプレフィックスに文字を|
超える({[<
文字が含まれないことを意味します。
入力には末尾の|
文字は含まれません。これらはコンテキストから推測する必要があります。
通常どおり、完全なプログラムまたは関数のいずれかを送信でき、入出力形式は許容されます。また、これはcode-golfであるため、ソースコードの長さ(バイト単位)によってコードがスコアリングされます。スコアが小さいほど優れています。
テストケース
ここにいくつかのテストケースがあります。さらに必要な場合は、このpythonスクリプトとBrain-Flak Wikiを使用して独自のテストケースを生成できます。これは、これらのテストケースの大部分が由来する場所です。
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}