-
Notifications
You must be signed in to change notification settings - Fork 0
/
a20.py
92 lines (68 loc) · 2.42 KB
/
a20.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
example = """
..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..###..######.###...####..#..#####..##..#.#####...##.#.#..#.##..#.#......#.###.######.###.####...#.##.##..#..#..#####.....#.#....###..#.##......#.....#..#..#..##..#...##.######.####.####.#.#...#.......#..#.#.#...####.##.#......#..#...##.#.##..#...##.#.##..###.#......#.#.......#.#.#.####.###.##...#.....####.#..#..#.##.#....##..#.####....##...##..#...#......#.#.......#.......##..####..#...#.#.#...##..#.#..###..#####........#..####......#..#
#..#.
#....
##..#
..#..
..###
""".strip()
day_string = "20"
f = open(f"input/{day_string}.input")
text = f.read().strip()
def parse(t):
algorithm, rest = t.split("\n\n")
image = dict()
for row, line in enumerate(rest.split("\n")):
for col, c in enumerate(line):
cell = True if c == "#" else False
image[row, col] = cell
return algorithm, image
def neighbours(row, col):
for drow in [-1, 0, 1]:
for dcol in [-1, 0, 1]:
yield drow + row, dcol + col
def bin_number(image, row, col, void):
result = ""
for r, c in neighbours(row, col):
if image.get((r, c), void):
result += '1'
else:
result += "0"
return int(result, 2)
def step(image, algorithm, void):
result = dict()
low_row = min(row for row, _ in image.keys()) - 1
low_col = min(col for _, col in image.keys()) - 1
high_row = max(row for row, _ in image.keys()) + 1
high_col = max(col for _, col in image.keys()) + 1
for row in range(low_row, high_row + 1):
for col in range(low_col, high_col + 1):
n = bin_number(image, row, col, void)
cell = True if algorithm[n] == '#' else False
result[row, col] = cell
return result
def run(algo, image, iters):
void = False
for i in range(iters):
image = step(image, algo, void)
if algo[0] == "#":
if i % 2 == 0:
void = True
else:
void = algo[-1] == "#"
return image
def part1(text):
algo, image = parse(text)
image = run(algo, image, 2)
return sum(image.values())
def part2(text):
algo, image = parse(text)
image = run(algo, image, 50)
return sum(image.values())
def main(text):
print("Part1:", part1(text))
print("Part2:", part2(text))
print("==== EXAMPLES ====")
main(example)
print("==== SOLUTION RESULT ====")
main(text)