私はセルオートマトンで遊んでいて、いくつかの興味深い動作をしているものを見つけました。仕組みは次のとおりです。
バイナリ文字列を左から右に読み取ります。1
その後に2
他の値が続く場合0
、結果にa を追加して読み取りを続けます。に遭遇した場合0
(または、残っている値が3つ未満の場合)、現在の値とaを追加して1
読み取りを続行します。文字列の最後1
に、結果にシングルを追加します。
これは、1世代の解決例です
01011111
^
最初に遭遇する0
ので01
、結果に追加します
01011111
^
01
ここでa 1
が発生したため、ゼロを追加して次の2つの値をスキップします
01011111
^
010
私たちは別の1
ものに遭遇するので、同じことをします
01011111
^
0100
現在1
、ジャンプするのに十分ではない別のスペースがあるので、現在のセルと1
(この場合は11
)を追加します
01011111
^
010011
最後にいるので、単一を追加して1
この世代を終了します
01011111
^
0100111
仕事
任意の妥当な形式の入力を指定すると、オートマトンの1世代を計算する関数またはプログラムを作成する必要があります。
これはコードゴルフの質問なので、回答はバイト単位で記録され、バイト数は少ない方が良いでしょう。
サンプル実装
Haskellのサンプル実装を次に示します(関数を定義しますd
が、プログラムは無限に繰り返しを出力します)。
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10
いるなら、印刷すべき11011
でしょうか?さらにいくつかのテストケースが役立つと思います