Skip to content

Instantly share code, notes, and snippets.

@NejcZupec
Last active November 21, 2018 14:22
Show Gist options
  • Save NejcZupec/fd2dd202c72dbefdc6e7e5f4621890fd to your computer and use it in GitHub Desktop.
Save NejcZupec/fd2dd202c72dbefdc6e7e5f4621890fd to your computer and use it in GitHub Desktop.
Game of Life
class Game(object):
def __init__(self, initial_state: set):
self.state = initial_state
@staticmethod
def get_neighbours(x: int, y: int) -> set:
offsets = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]
return set([(x + i, y + j) for (i, j) in offsets])
def get_live_neighbours(self, x: int, y: int) -> set:
return {cell for cell in self.get_neighbours(x, y) if cell in self.state}
def generate_all_candidates(self) -> set:
candidates = set()
for x, y in self.state:
candidates.add((x, y))
for neighbour in self.get_neighbours(x, y):
candidates.add(neighbour)
return candidates
def next_state(self) -> set:
new_state = set()
for x, y in self.generate_all_candidates():
live_neighbours_count = len(self.get_live_neighbours(x, y))
if (x, y) in self.state:
if 1 < live_neighbours_count < 4:
new_state.add((x, y))
else:
if live_neighbours_count == 3:
new_state.add((x, y))
return new_state
from game import Game
def test_initial_state():
state = [(0, 0), (1, 1)]
g = Game(state)
assert g.state == state
def test_get_neighbours():
assert Game.get_neighbours(0, 0) == {
(-1, -1),
(-1, 0),
(-1, 1),
(0, -1),
(0, 1),
(1, -1),
(1, 0),
(1, 1),
}
assert Game.get_neighbours(1, 1) == {
(0, 0),
(0, 1),
(0, 2),
(1, 0),
(1, 2),
(2, 0),
(2, 1),
(2, 2),
}
def test_get_live_neighbours():
state = [(0, 0), (1, 1)]
g = Game(state)
assert g.get_live_neighbours(0, 0) == {(1, 1)}
assert g.get_live_neighbours(1, 1) == {(0, 0)}
assert g.get_live_neighbours(0, 1) == {(0, 0), (1, 1)}
assert g.get_live_neighbours(3, 3) == set()
state = [(1, 1), (2, 0), (2, 2)]
g = Game(state)
assert g.get_live_neighbours(2, 1) == {(1, 1), (2, 0), (2, 2)}
def test_generate_all_candidates():
state = [(0, 0), (1, 1)]
g = Game(state)
assert g.generate_all_candidates() == {
(0, 0),
(1, 1),
(-1, -1),
(-1, 0),
(-1, 1),
(0, -1),
(0, 1),
(1, -1),
(1, 0),
(1, 1),
(0, 0),
(0, 1),
(0, 2),
(1, 0),
(1, 2),
(2, 0),
(2, 1),
(2, 2),
}
def test_next_state():
g = Game([(12, 13)])
assert g.next_state() == set()
g = Game([(1, 1), (2, 0)])
assert g.next_state() == set()
g = Game([(1, 1), (2, 0), (0, 2)])
assert g.next_state() == {(1, 1)}
g = Game([(1, 1), (2, 0), (2, 2)])
assert g.next_state() == {(1, 1), (2, 1)}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment