ライフゲーム


APLで書かれたライフゲームをJ言語に翻訳しようとしています。
もとのプログラムはこれ。

life ← {↑1 ω∨.^3 4=+/,潤イ1 0 1∘.Θ潤イ1 0 1∘.Φ⊂ω}

なにがなんだかわかりませんね。
しばらく放っておいたのですが、動画で検索したら、解説付きのところがあったので、だいたい仕組みはわかりました。
日本ではライフゲームというけど、英語ではConway's Game of Lifeというのが普通らしいです。
ルールはウィキペディアで見ていただくとして、アルゴリズムマトリックスで考えるAPL/J言語らしく、上下左右斜めにずらしたものと現状の9枚のマトリックスを足して、するとそれぞれのマスの周辺に生きているのがいくつあるかわかりますので、3のものを取り出します。あと、4のもので今現在生きているマスと重なるものもルールに合っていますのでそれを加えるというものです。


上のAPLで書かれたものはlifeという動詞を作っています。これに引数を与えるとω(オメガ)のところに入って、結果として、もとの引数のマトリックスの次の状態を返すものです。それにさらにlifeという動詞を作用させていけば、順々にライフゲームが進んで行きます。


さて、手で検証しながらやると大変そう。そもそも元のマトリックスを作るのもたいへんそうですね。

   i.3 3
0 1 2
3 4 5
6 7 8
   (i.3 3) e. 1 2 3 4 7
0 1 1
1 1 0
0 1 0
   r=: (i.3 3) e. 1 2 3 4 7  NB.とりあえずこれをrとします
   (_2 _2&|.@,&(4 8 $0)) r   NB.大きな場所の真ん中にもってくる
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0
0 0 1 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
   makeR=:(_2 _2&|.@,&(4 8 $0))
   R=:makeR r

やっと材料ができたところです。先は長い。

   (+/@( (9 2 $, > { (1 0 _1);(1 0 _1))&|.)) R
0 0 0 0 0 0 0 0
0 0 1 2 2 1 0 0
0 1 3 4 3 1 0 0
0 1 4 5 4 1 0 0
0 1 3 3 2 0 0 0
0 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0
   (>@( (3&=);(4&=))@(+/@( (9 2 $, > { (1 0 _1);(1 0 _1))&|.)))R
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 1 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 1 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
   (1 $~ $@]) R
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

これをひとつの動詞にするのがやっかいなのですが、2日ほど試行錯誤して、とりあえず出来上がり!

   life=:+./@( (>@( (1$~$@]);]))*.(>@( (3&=);(4&=))@(+/@( (9 2 $, > { (1 0 _1);(1 0 _1))&|.))))
   R; (life R); (life life R)   NB.とりあえす3世代で実験!
 +---------------+---------------+---------------+
 |0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|
 |0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 1 0 0 0 0|
 |0 0 0 1 1 0 0 0|0 0 1 1 1 0 0 0|0 0 1 1 0 0 0 0|
 |0 0 1 1 0 0 0 0|0 0 1 0 0 0 0 0|0 1 0 0 1 0 0 0|
 |0 0 0 1 0 0 0 0|0 0 1 1 0 0 0 0|0 0 1 1 0 0 0 0|
 |0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|
 |0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|
 +---------------+---------------+---------------+

成功と思います。


以上