EXCELで1次元セルオートマトンを作る

f:id:accs2014:20190110115357p:plain:right:w400

 こないだに続いてEXCELネタです。
 特に目新しくもないですが、1次元セルオートマトンも関数で簡単に実現できますのでメモしておきます。


 まずは遷移ルールの入力/表示部分です。
f:id:accs2014:20190110115412p:plain:w550

 セルD2は次のようにします。これはルール入力欄(E4:L4)に基づきルール番号を計算して表示します(ただの表示ですので、この式はなくても動きます)。

="ルール"&SUMPRODUCT(E4:L4,{1,2,4,8,16,32,64,128})


 E3:L3には「="000"」から「="111"」までを入力します。これらは単なるラベルではなく後に参照されますので、このとおり入力する必要があります。
f:id:accs2014:20190110115410p:plain:w450

 これとルール入力欄(E4:L4)によって遷移ルールが定まります。
 この例では「011」の下が「1」となっていますので、1世代前の左側・中央・右側のセルがそれぞれ「0」「1」「1」であるとき、セルの値は「1」となります。


 続いてセルオートマトン部分です。
 左端の列(A列)の値はいずれも「0」としておきます。同じく右端の列の値も同じく「0」としておきます(列数が多すぎるとかなり重くなりますので、どの列を右端にするかは適宜決定してください。)。
f:id:accs2014:20190110115407p:plain:w450

 こうしないとエラーが発生してどんどん伝播してしまうからですが、遷移ルールによってはやはり端の列付近で不自然な結果になりますので、これを避けたい場合は十分な列数を確保して初期状態の設定にも注意する必要があります。


 最後にセルオートマトン内部です。
f:id:accs2014:20190110115404p:plain:w500

 7行目は初期状態入力欄ですのでさしあたりすべて「0」としておきます。
 そしてB8セルに次のように入力し、全体(右下方)にコピーします。

=HLOOKUP(A7&B7&C7,$E$3:$L$4,2)

 あとは見やすいように、値が「1」であるセルを塗りつぶすように条件付き書式を設定すれば設定完了です。


f:id:accs2014:20190110115357p:plain:right:w400

 実行の様子です(冒頭の画像の再掲)。ルール入力欄(E4:L4)と初期状態入力欄(7行目)の値を書き換えればセルオートマトン全体がリアルタイムで更新されます。
 ただし条件付き書式のせいか、再計算には結構時間がかかり、値の変更が直ちに反映されない場合がありますので注意してください。
 画像はルール90を示しています。ルール入力欄(E4:L4)の値を「0,1,0,1,1,0,1,0」とし、初期状態としてセルAI7の値を「1」としています。


f:id:accs2014:20190110115439p:plain:right:w400

 次にルール30です。ルール入力欄(E4:L4)の値を「0,1,1,1,1,0,0,0」としています。

f:id:accs2014:20190110115432p:plain:right:w400

 最後にルール110です。ルール入力欄(E4:L4)の値は「0,1,1,1,0,1,1,0」です。