Brainfuck、579バイト
,[<<+>>>>+<<[[<+>>+<-]++++++[>-------<-]>-[-[-[-[--------------[--[<+++++[>-----
-<-]>+[--[<<[-]>>-]]<]>[>>-<<<<<[-]<[<]<<<[<]>>>>>>>>[<]<-[+>]+[->+]>>>>+>[<-]<[
>+<-<]>]<]>[<<<[-]-[<]>>>>>>>>>>>[<]<<<<<<[<]<-[+>]+[-<+]<<<+<[>-<<<]>[-<+<]]]<]
>[+>[-<]<[<<]<[-]>>]]<]+>[-[<-]<[>+>+<<-<]<[-]>+>]<<[>-]>[,>]<]<+<[>]>[>>>[<<<<[
-<]<<<]>>>+>>>>[<<<<->>>>[>>>[-<]>>>>]]]>[<<<[<+[-->>]]>[-[.[-]]]>[<]>[<<++++++[
>+++++++<-]>+>>[<<.>>-]<<++>-[<.>-]+++[<+++++>-]+<<<<<<+>[<<[>->>>>>.[[-]<<<<]<<
<+>>>]>[->->>>>[-]]]<[->+[>>>>>]>>[<]<<<<<<<<[[-]<]>[++.[-]>>>>>>>]<]]>>]<[>>>>>
>>]+[-<<<<<[-]<<],]
書式設定とコメント付き:
,
[
<<+>> >>+<<
[
[<+> >+<-]
++++++[>-------<-]
>-
[
not plus
-
[
not comma
-
[
not minus
-
[
not period
--------------
[
not less than
--
[
not greater than
<+++++[>------<-]>+
[
not open bracket
--
[
not close bracket
<<[-]>>-
]
]
<
]
>
[
greater than
>>-<<
<<<[-]<[<]<<<[<]
>>>>>>>>[<]
<-[+>]
+[->+]
>>>>+>[<-]
<[>+<-<]
>
]
<
]
>
[
less than
<<<[-]-[<]
>>>> >>>>>>>[<]
<<<<<<[<]
<-[+>]
+[-<+]
<<<+<[>-<<<]
>[-<+<]
]
]
<
]
>
[
minus
+>[-<]
<[<<]
<[-]>>
]
]
<
]
+>
[
plus
-[<-]
<[>+>+<<-<]
<[-]>+>
]
<<
[
comma or period or bracket
>-
]
>[,>]
<
]
comma or period or bracket or eof
<+<
[
start and end same cell
>
]
>
[
>>>
[
<<<<[-<]<<<
]
>>>+>>>>
[
start right of end
<<<<->>>>
[>>>[-<]>>>>]
]
]
>
[
<<<
[
<+[-->>]
]
>[-[.[-]]]
>[<]
>
[
<<++++++[>+++++++<-]>+>>
[<<.>>-]
<<++>-[<.>-]
+++[<+++++>-]
+<<<<< <+>
[
<<
[
go left
>->>>>>.
[[-]<<<<]
<<<+>>>
]
>
[
toggle left right
->->>>>[-]
]
]
<
[
toggle right left
->+[>>>>>]>>[<]
<<<<<<<<
[
[-]<
]
>
[
go right
++.[-]
>>>>>>>
]
<
]
]
>>
]
<[>>>>>>>]
+[-<<<<<[-]<<]
,
]
これは、Keith Randallのソリューションと同じアプローチを使用し、すべての連続したシーケンスを+-<>
シミュレーションによって最適化します。たとえば、に+++>-<+>---<
なり++++>----<
、に>+<+<<+>+<->>>>
なり+<+>>+>
ます。
オンラインでお試しください。
(シミュレートされたセルの絶対値が256に近づくと、オーバーフローの問題が発生します。)
全体の構造は
while not EOF:
while not EOF and next char not in ",.[]":
process char
print minified sequence (followed by the char in ",.[]" if applicable)
テープは7セルのノードに分割されています。内側のループの先頭では、メモリレイアウトは
0 s 0 c 0 a b
ここで、s
は開始セルのブールフラグc
、現在の文字、a
シミュレーションセル値のマイナス部分(プラス1)、およびb
シミュレーションセル値のプラス部分です。
縮小されたシーケンスが印刷されるとき、メモリレイアウトは
d n e 0 0 a b
where d
は、方向を表すブールフラグで、以前a
とb
同じ(ただし、印刷するn
とe
1/0になります)であり、エンドノードではゼロ以外の値になります。n
は、ノードが表示された回数に関連しe
、内側のループを停止したcharの値(プラス1)です。
もともと、ノードごとの詳細情報を追跡することを検討しました。左端と右端のノードをブールフラグとして、ノードの開始ノードと終了ノードに対する位置。ただし、必要に応じて隣接するセルを調べ、開始ノードを見つけるために左右のスキャンを実行することで、これを回避できます。
縮小されたシーケンスを印刷し、シミュレートされたポインターを移動する方法を決定するとき、一般的なアプローチをとることができます:開始ノードと終了ノードが同じである場合は任意の方向に)終了ノードから離れることから始め、左端と右端で向きを変えますノード、および終了ノードが表示された回数に基づいて停止します。開始ノードと終了ノードが同じ場合は3回、そうでない場合は2。
++>>++<<--
出力する必要>>++<<
があり、それはカバーされませんでした。さらにテストケースを追加してください。