一次元セルオートマトンのルール30を作成

ライフゲームはXY座標の二次元ですが、もっと単純化した一次元のセルオートマトンがあるので調べてみました。一次元セルオートマトンでは、自分と左右のセルの状態で、次の世代のセルの状態を決めるのでとてもシンプルです。今回は勉強のためルール30を実装しました。

一次元の場合は、配列1行が現在の状態を表すので、それをもとに、次の世代(行)を作成します。そのためゲームループのような仕組みは必要ありません。また、数字を入れてみればわかるのですが、Cells[0][0]を確認するときは、Cells[0][0+maxColumns-1%maxColumns]がそのセルの左のセルになります。つまり配列の一番最後の要素で、最も右側にあるのが隣にあることになります。剰余で求めることができるので以下のように書きます。

以下のソースコードでmaxColumns=5、x=0の時などをやってみるとすぐ理解できます。

 

 

デモ

http://hajimete-program.com/demo/cellular_automaton_rule30.html

github

https://gist.github.com/dev001hajipro/c75124209419833b46f16632b0319de5

参考資料

http://home.a00.itscom.net/hatada/lp2012/c06/c06.html

 

JavaScriptでセル・オートマトンのワイヤーワールドを作りました。

logisimやマインクラフトで回路を作ったりしていてデジタル回路を学んでいるときに、セル・オートマトンのワイヤーワールドを見つけました。セル・オートマトンでは、コンウェイのライフゲームが有名ですが、このワイヤーワールドは回路図と同じような仕組みなので非常に興味深いです。またライフゲームに比べると規則が非常にシンプルです。

規則

状態

セルは以下の4つの状態のどれかです。色は特に必要なくて、グレースケールなどでも問題ないです。見やすいように、導体(電子が流れるところ)を黄色にして、電子を青赤で表現するのが多いようです。

  • 空(Empty)は黒
  • 導体(Conductor)は、黄色
  • 電子の頭(Electron Head)は、青
  • 電子の尾(Electron Tail)は、赤

世代ルール

世代は単純に、ゲーム中の1ループのことです。

  • 電子の頭は、電子の尾になる
  • 電子の尾は、導体になる
  • 導体は、近傍セル(その導体の周りのセルの事)のうち、1つまたは2つのセルが、電子の頭であった場合、その導体セルは、電子の頭になる

最後がちょっとわかりづらいので画像で説明します。

中央の導体セルから、周り8個を見る

上記図は、中央の導体セルから、周り(近傍きんぼう)の8個のセルを見ると、画像の左側は、青が1つ、画像の右側は青が2つあります。この時に次の世代に進むと、以下画像になります。

注目してほしいのは、中央の導体セルが黄色から、世代ルールにより、青に変わったところです。

たったこれだけのルールですが、これコンピュータが作れます。

まさに電子(Electron)のよう!

ゲームループを動かすと、世代ルールが適用されて電子の頭(青)と電子の尾(赤)が移動しているのが分かります。

 

ダイオード

 

NOT回路・インバーター

確かに、世代ルールが適用されて、電子が流れなくなるので、NOT回路と同じになります。ですがこれだけ単純だと不思議な感じがします。

 

ソースコードをもう少し綺麗にしたらデモもアップロードしようと思います。現在のソースコードはgithubにアップロードしました。

ソースコード

https://github.com/dev001hajipro/wireworld

参考資料

ゲートICやレジスターを作るには以下が参考になりそうです。

https://www.quinapalus.com/wi-index.html

ワイヤーワールドでデジタル回路のNOT回路やOR回路など基本的なものを作るときの参考になりそうです。

http://karlscherer.com/Wireworld.html