IchigoJamでウルフラムコード

注意

2016年6月ごろの記事をもとにしています。 IchigoJamのバージョンも当時のものを対象としています。

ウルフラムコードとは?

ルール とても簡単なルールから複雑なパターンを生成できる1次元セルオートマトン。 Wolframさん(Mathematicaとかを作った人)が発見したのでそう呼ばれている。 次の世代でのセルの状態は、前後のセルを含めた3個のセルの状態から決まる。 3個のセルの状態は8通りあるので、その組み合わせで256通りのルールが考えられる。 特定のルールに基いてセルの状態が変化していく様子を世代ごとに並べると、ルールの単純さからは想像もつかない複雑なパターンが現れることがある。

アルゴリズム

IchigoJamのセミグラフィック文字を使うと、1キャラクタで2x2セルを表すことができる。せっかくなので、これをうまく利用する方法を考えてみたい。 2x2セルを求める あるセルの状態は、その前の世代での3個のセルの状態だけで決まる。同じ世代の他のセルとかは関係ないので、いくつかのセルをまとめて考えることもできる。 隣り合う2個のセルをまとめて考えると、それらは連続した4個のセルの状態から決まることになる。 さらにまとめて、2個のセルの2世代分、すなわち2x2=4個のセルについては、連続した6個のセルから求めることができる。 これでセミグラフィック文字の1文字分を求めることができる。 16個あるセミグラフィック文字#80~#8Fは下位4ビットが4個のセルの状態に対応している、と考えようとするとビットの並びが微妙に都合が悪いので、ちょっと細工する必要がある。

ソース

1 'WolframCode (semi-graphic)
10 W=0:INPUT "1-255?",W
11 if W<1 or W>255 END
12 LC0,23:?:?
13 LC12,23:?"RULE ";
20 forI=0to7
21 if (I&1)=(I>>2) then J=I else J=I^5
22 [J]=(W>>I)&1
23 next
24 ?W
30 forI=0to63
31 A=[(I>>1)&7]
32 B=[(I>>2)&7]
33 C=[I&7]:C=[C|(A<<1)|(B<<2)]
34 D=[I>>3]:D=[A|(B<<1)|(D<<2)]
35 [8+I]=#80|A|(B<<1)|(C<<2)|(D<<3)
36 next
37 ?:?:LC16,23:?CHR$(#84)
40 B=SCR(0,22)&#0C:A=SCR(31,22)&#0C:A=(B<<2)|A
41 forI=0to31
42 B=SCR((I+1)%32,22)&#0C:A=(B<<2)|(A>>2)
43 ?CHR$([8+A]);
44 next
45 ifINKEY()==0 GOTO40
50 ?:?:GOTO10

使い方

1-255の番号を入力すると、それをルールとするパターンが延々と表示される。 何かキーを押したら中断し、番号の入力に戻る。 範囲外の値や何も入れずにEnterを押すと終了。

実行例

実行例