このPyCon talkで、Jack Diederich はConway の Game of Life のこの「単純な」実装を示しています。私は GoL にも準高度な Python にも精通していませんが、次の 2 つの点がなければ、コードは非常に簡単に理解できるようです。
- の使用
yield
。以前にyieldを使用してジェネレーターを作成するのを見たことがありますが、8つ続けて使用するのは新しいものです... 8つのジェネレーターのリストを返しますか、またはこれはどのように機能しますか? set(itertools.chain(*map(neighbors, board)))
. スターは、隣人をボードに適用した結果のリスト (?) をアンパックします。
map、filter、reduce を使用していくつかの Python コードをハッキングすることに慣れているが、日常的に Python を使用していないプログラマーのために、誰かがこれら 2 つの部分を説明しようとすることはできますか? :-)
import itertools
def neighbors(point):
x, y = point
yield x + 1, y
yield x - 1, y
yield x, y + 1
yield x, y - 1
yield x + 1, y + 1
yield x + 1, y - 1
yield x - 1, y + 1
yield x - 1, y - 1
def advance(board):
newstate = set()
recalc = board | set(itertools.chain(*map(neighbors, board)))
for point in recalc:
count = sum((neigh in board) for neigh in neighbors(point))
if count == 3 or (count == 2 and point in board):
newstate.add(point)
return newstate
glider = set([(0,0), (1,0), (2, 0), (0,1), (1,2)])
for i in range(1000):
glider = advance(glider)
print glider