-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday17.py
More file actions
91 lines (75 loc) · 2.83 KB
/
day17.py
File metadata and controls
91 lines (75 loc) · 2.83 KB
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
import numpy as np
from aocd.models import Puzzle
from funcy import lmap
def solve_puzzle_one(input_array):
on = {}
for i, line in enumerate(input_array):
for j, ch in enumerate(line):
if ch == '#':
on[(i, j, 0)] = 1
size = len(input_array)
for cycle in range(6):
size += 2
new_on = {}
for x in range(-size, size):
for y in range(-size, size):
for z in range(-size, size):
neighbours_on = 0
for dx in [-1, 0, 1]:
for dy in [-1, 0, 1]:
for dz in [-1, 0, 1]:
if dx == 0 and dy == 0 and dz == 0:
continue
if (x + dx, y + dy, z + dz) in on:
neighbours_on += 1
if (x, y, z) in on and 2 <= neighbours_on <= 3:
new_on[(x, y, z)] = 1
elif neighbours_on == 3:
new_on[(x, y, z)] = 1
on = new_on
print(len(on))
def solve_puzzle_two(input_array):
on = {}
for i, line in enumerate(input_array):
for j, ch in enumerate(line):
if ch == '#':
on[(i, j, 0, 0)] = 1
size = len(input_array)
for cycle in range(6):
size += 2
new_on = {}
# Possible improvement:
# 1. build a set that contains all neighbours
# 2. check rules on all neighbours
for x in range(-size, size):
for y in range(-size, size):
for z1 in range(-size, size):
for z2 in range(-size, size):
neighbours_on = 0
for dx in [-1, 0, 1]:
for dy in [-1, 0, 1]:
for dz1 in [-1, 0, 1]:
for dz2 in [-1, 0, 1]:
if dx == 0 and dy == 0 and dz1 == 0 and dz2 == 0:
continue
if (x + dx, y + dy, z1 + dz1, z2 + dz2) in on:
neighbours_on += 1
if (x, y, z1, z2) in on and 2 <= neighbours_on <= 3:
new_on[(x, y, z1, z2)] = 1
elif neighbours_on == 3:
new_on[(x, y, z1, z2)] = 1
on = new_on
print(len(on))
def parse_input(data):
return np.array(lmap(list, data.splitlines()))
test_input = """.#.
..#
###"""
if __name__ == '__main__':
puzzle = Puzzle(year=2020, day=17)
if False:
array = parse_input(test_input)
else:
array = parse_input(puzzle.input_data)
solve_puzzle_one(array)
solve_puzzle_two(array)