-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay 20.py
78 lines (74 loc) · 3.39 KB
/
Day 20.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
test = '''#.#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..###..######.###...####..#..#####..##..#.#####...##.#.#..#.##..#.#......#.###.######.###.####...#.##.##..#..#..#####.....#.#....###..#.##......#.....#..#..#..##..#...##.######.####.####.#.#...#.......#..#.#.#...####.##.#......#..#...##.#.##..#...##.#.##..###.#......#.#.......#.#.#.####.###.##...#.....####.#..#..#.##.#....##..#.####....##...##..#...#......#.#.......#.......##..####..#...#.#.#...##..#.#..###..#####........#..####......#...
#..#.
#....
##..#
..#..
..###'''.split('\n\n')
inp = open('Day 20.txt','r').read().split('\n\n')
from copy import deepcopy
from math import inf
from collections import defaultdict
def part1(inp):
output = inp[0]
grid = inp[1].split('\n')
lights = defaultdict(lambda:False)
for y in range(len(grid)):
for x in range(len(grid[y])):
if grid[y][x] == '#':
lights[(y,x)] = True
for steps in range(1):
min_y = inf
min_x = inf
max_y = 0
max_x = 0
for light in lights:
min_y = min(light[0],min_y)
min_x = min(light[1],min_x)
max_y = max(light[0],max_y)
max_x = max(light[1],max_x)
darks = defaultdict(lambda:True)
for y in range(min_y-2,max_y+3):
for x in range(min_x-2,max_x+3):
square = [(y-1,x-1),(y-1,x),(y-1,x+1),(y,x-1),(y,x),(y,x+1),(y+1,x-1),(y+1,x),(y+1,x+1)]
current = output[int(''.join([str(int(lights[i] == True)) for i in square]),2)]
if current == '.': darks[(y,x)] = False
lights = defaultdict(lambda:False)
for y in range(min_y-2,max_y+3):
for x in range(min_x-2,max_x+3):
square = [(y-1,x-1),(y-1,x),(y-1,x+1),(y,x-1),(y,x),(y,x+1),(y+1,x-1),(y+1,x),(y+1,x+1)]
current = output[int(''.join([str(int(darks[i] == True)) for i in square]),2)]
if current == '#': lights[(y,x)] = True
print(len(lights))
def part2(inp):
output = inp[0]
grid = inp[1].split('\n')
lights = defaultdict(lambda:False)
for y in range(len(grid)):
for x in range(len(grid[y])):
if grid[y][x] == '#':
lights[(y,x)] = True
for steps in range(25):
min_y = inf
min_x = inf
max_y = 0
max_x = 0
for light in lights:
min_y = min(light[0],min_y)
min_x = min(light[1],min_x)
max_y = max(light[0],max_y)
max_x = max(light[1],max_x)
darks = defaultdict(lambda:True)
for y in range(min_y-2,max_y+3):
for x in range(min_x-2,max_x+3):
square = [(y-1,x-1),(y-1,x),(y-1,x+1),(y,x-1),(y,x),(y,x+1),(y+1,x-1),(y+1,x),(y+1,x+1)]
current = output[int(''.join([str(int(lights[i] == True)) for i in square]),2)]
if current == '.': darks[(y,x)] = False
lights = defaultdict(lambda:False)
for y in range(min_y-2,max_y+3):
for x in range(min_x-2,max_x+3):
square = [(y-1,x-1),(y-1,x),(y-1,x+1),(y,x-1),(y,x),(y,x+1),(y+1,x-1),(y+1,x),(y+1,x+1)]
current = output[int(''.join([str(int(darks[i] == True)) for i in square]),2)]
if current == '#': lights[(y,x)] = True
print(len(lights))
part1(inp)
part2(inp)