-
Notifications
You must be signed in to change notification settings - Fork 0
/
17.py
63 lines (53 loc) · 2.09 KB
/
17.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
from collections import defaultdict
from itertools import combinations_with_replacement
with open("input17.txt") as f:
lines = [x.strip() for x in f.readlines()]
state = defaultdict(lambda: defaultdict(lambda: defaultdict(bool)))
for y, l in enumerate(lines):
for x, c in enumerate(l):
if c == "#":
state[0][y][x] = True
else:
state[0][y][x] = False
neighbors_positions = []
for z in range(-1, 2):
for y in range(-1, 2):
for x in range(-1, 2):
if (z,y,x) != (0,0,0):
neighbors_positions.append((z,y,x))
def get_active_neighbors(current_state, z, y, x):
active_neighbors = 0
for pos in neighbors_positions:
if current_state[z+pos[0]][y+pos[1]][x+pos[2]]:
active_neighbors += 1
return active_neighbors
def get_state_range(d: dict):
mi = min(d.keys()) if d.keys() else 0
ma = max(d.keys()) if d.keys() else 0
return mi, ma
original_state_dimensions = get_state_range(state[0])
def enlarge_state_range(d: dict, current_round):
mi, ma = get_state_range(d)
return original_state_dimensions[0] - current_round, original_state_dimensions[1] + current_round + 1
def round_of_3d_GoL(state, current_round):
new_state = defaultdict(lambda: defaultdict(lambda: defaultdict(bool)))
for z in range(*enlarge_state_range(state, current_round)):
for y in range(*enlarge_state_range(state[z], current_round)):
for x in range(*enlarge_state_range(state[z][y], current_round)):
if state[z][y][x] and get_active_neighbors(state, z,y,x) not in [2, 3]:
new_state[z][y][x] = False
elif not state[z][y][x] and get_active_neighbors(state, z,y,x) == 3:
new_state[z][y][x] = True
else:
new_state[z][y][x] = state[z][y][x]
return new_state
rounds = 6
for i in range(1, rounds+1):
state = round_of_3d_GoL(state, i)
num_active = 0
for z in state:
for y in state[z]:
for x in state[z][y]:
if state[z][y][x]:
num_active += 1
print(num_active)