ライフゲームのアルゴリズム
gaucheでライフゲーム書いてみました。
何番煎じかはわかりませんが、というか誰もが通る道?
なるべく速いアルゴリズムを考えてみます。(200x200の盤面です。)
sdlの部分は以下からもらいました。
http://d.hatena.ne.jp/scinfaxi/20070222/1172123218
まずはナイーブな実装
上下にオフセットしたもののそれぞれに関してオフセットしたものの内
オフセットしてないものを除いたものを全部足せば周りの生きてるセルが取れるよねっていうことで。
んむ、チョロ過ぎる。案の定遅い。自分のパソコンで11fps位。そこそこ速いcpuでもこれなので
動かすときは注意。
色々悩みながらベクタでやると、速くなったり遅くなったり。
vector-mapやるよりwhileでぶん回すほうが速いとか
uvectorあんまり速くはならないとか
set!あると最適化が効かないのか遅くなるとか色々考えながらやってると、どうにかこうにか45fps。
結局全部main-loopの中に押し込んだほうが早いということで。
作用の境界が一つずれてるのは仕様です;
速いらしいというハッシュテーブルでも実装してみましたが、
自分には無理でした。ベクタ版と比べると百倍近く速度に差が出てしまった。
リスト版
https://gist.github.com/998982
ベクタ版
https://gist.github.com/1010414
ハッシュテーブル版
https://gist.github.com/1010411
自分の中で結論としては、
リストでやると読みやすくなるけど遅い。
ベクタは速くなるけど読みにくい。
ハッシュテーブルは私には使いこなせません、と。