-
Notifications
You must be signed in to change notification settings - Fork 0
/
conway_numpy.py
95 lines (78 loc) · 2.22 KB
/
conway_numpy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import sys
import time
import random
from numpy import ndarray
COLS = 177
ROWS = 60
EMPTY_OUT = " " * ((COLS+1)*ROWS)
def update_ghost(grid, ghost_grid):
"""
A virtual grid that includes wrapped edges, so that we don't have to
do funky modulo arithmetic.
"""
# Copy bottom of grid to top of ghost_grid
for n in xrange(COLS):
ghost_grid[n+1,0] = grid[n,ROWS-1]
# Copy top of grid to bottom of ghost_grid
for n in xrange(COLS):
ghost_grid[n+1,ROWS+2-1] = grid[n,0]
# Copy the rest of grid to ghost_grid
for y in xrange(ROWS):
for x in xrange(COLS):
ghost_grid[x+1,y+1] = grid[x,y]
# Wrap ghost_grid left and right columns
for y in xrange(ROWS+2):
ghost_grid[0,y] = ghost_grid[COLS+2-2,y]
ghost_grid[COLS+2-2,y] = ghost_grid[1,y]
def count_neighbors(x, y, ghost_grid):
return \
ghost_grid[(x-1)+1,(y-1)+1] + ghost_grid[(x)+1,(y-1)+1] + ghost_grid[(x+1)+1,(y-1)+1] + \
ghost_grid[(x-1)+1,(y )+1] + ghost_grid[(x+1)+1,(y )+1] + \
ghost_grid[(x-1)+1,(y+1)+1] + ghost_grid[(x)+1,(y+1)+1] + ghost_grid[(x+1)+1,(y+1)+1]
def pretty_print(grid):
out = bytearray(EMPTY_OUT)
out_i = 0
for y in xrange(ROWS):
for x in xrange(COLS):
if grid[x,y] == 0:
out[out_i] = ' '
out_i += 1
else:
out[out_i] = '#'
out_i += 1
out[out_i] = '\n'
out_i += 1
sys.stdout.write(out)
def next_gen(grid, ghost_grid):
for y in xrange(ROWS):
for x in xrange(COLS):
neighbors = count_neighbors(x, y, ghost_grid)
#print!("N %d, ", neighbors)
if neighbors < 2 or neighbors > 3:
grid[x,y] = 0
elif neighbors == 3:
grid[x,y] = 1
update_ghost(grid, ghost_grid)
def run_once():
grid = ndarray(shape=(COLS, ROWS), dtype=int)
ghost_grid = ndarray(shape=(COLS + 2, ROWS + 2), dtype=int)
# Generate a random grid
for y in xrange(ROWS):
for x in xrange(COLS):
grid[x,y] = random.randint(0, 2)
pretty_print(grid)
update_ghost(grid, ghost_grid)
for i in xrange(10000):
sys.stdout.write("\n\n\n")
pretty_print(grid)
#nanosleep(&wait, NULL)
next_gen(grid, ghost_grid)
def main():
run_once()
print >>sys.stderr, "Warmed up."
start = time.time()
run_once()
end = time.time()
print >>sys.stderr, "Ran in", (1000 * (end - start)), "ms"
if __name__ == '__main__':
main()