libAlexandrina.so.octopress

ライフゲームを真面目に設計実装

| Comments

ペアプロでライフゲームを3度作った。

meetup #56 〜 Coderetreat mini again 〜 - kanazawa.rb | Doorkeeper

そのうちの1つはこれ。

PharaohKJ/ore_lifegame: Kanazawa.rb meetup #56 でペアプロしたライフゲーム(未完成)

ペアプロ会でやってて見えてくるのは以下。

  • 採用したプログラミング言語に対する知識、習熟度
  • その言語を使って開発する方法、および、習熟度
  • IDEやエディタなどの便利な機能

こういうことを話しても「言われてみると俺、そういうところ適当でやってるな」という気づきが多いのでとてもよい。

だがしかし、ある程度コンテキストを共有できており、「提示された仕様」と「その実装」というのを真面目に議論するということをやりたかった。

ライフゲーム - Wikipedia

より以下を抜粋し

  • エンティティを抜き出し
  • 足りてない仕様、表現があいまいな部分を忖度し
  • できるだけプリミティブを用いず
  • クラス化して実装していく

ということを行えてよかった。

1
2
3
4
5
6
7
8
9
10
ライフゲームでは初期状態のみでその後の状態が決定される。碁盤のような格子があり、一つの格子はセル(細胞)と呼ばれる。各セルには8つの近傍のセルがある (ムーア近傍) 。各セルには「生」と「死」の2つの状態があり、あるセルの次のステップ(世代)の状態は周囲の8つのセルの今の世代における状態により決定される。
セルの生死は次のルールに従う。
誕生
死んでいるセルに隣接する生きたセルがちょうど3つあれば、次の世代が誕生する。
生存
生きているセルに隣接する生きたセルが2つか3つならば、次の世代でも生存する。
過疎
生きているセルに隣接する生きたセルが1つ以下ならば、過疎により死滅する。
過密
生きているセルに隣接する生きたセルが4つ以上ならば、過密により死滅する。

毎度、議論してて一番楽しいのは「次世代のセルの運命は周囲によるが、セル自体は周囲を知ることができるべきか、統括する碁盤から教えられるべきか」という議論である。

各セルは独立して存在し、オブザーバーパターンなどを用いて世界が「次世代に行け!」とイベントがくると、自発的に周囲を調べて次の世代に進むのか。

それとも、世界が「次世代に行け!」とイベントがくるさい、「お前の周囲の情報はこれである」と提示してきて、その結果、セルは次の世代に進むのか。

さらにそれとも、セルはただの状態保持者であって生きるか死ぬかは神(=世界、碁盤)が司っているのか。

などなど。あと忖度しないでわざと議論すると「この仕様にはセルの次の世代は周囲が決めるとあるが、碁盤全体が同時に次の世代に進むのか、それとも何か順序があるのか」などもある。

こういうのは「仕事じゃないから楽しめる」感じだが、「この仕様書、指示書にはモレがある!」と指摘できるのもまた大事なところなんじゃないだろうか。

まーそういうライフゲーム実装におけるペアプロの楽しみ方がやりすぎて大体わかってきた。「実行エラーがとれないんです」レベルはもう勘弁だが、設計の議論が楽しいのでまたメンツを変えてやりたい。

懇親会

パパロク 武蔵本店(武蔵・近江町/居酒屋) | ホットペッパーグルメ

に突撃。ペアプロして話も盛り上がるだろうから個室がいいなと希望した。

ウイスキーのサワー割という劇物を作成した結果、全く記憶がない! ヤバイ!

翌朝頭痛で目覚めたら玄関にカバンが散らばっていて客間に2人寝ていた。

いつもなら食事の写真が大量にあるはずだがまさかのゼロ。パパロクさんまでは記憶あるが。

昔、泥酔したときに、電話帳に乗ってる女子全員にメールを送るという奇行経験があるので履歴を確認してしまう…。

電話履歴をみるとひかりやさんに行ったらしい。

Comments