Last active
November 21, 2018 14:22
-
-
Save NejcZupec/fd2dd202c72dbefdc6e7e5f4621890fd to your computer and use it in GitHub Desktop.
Game of Life
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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