-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathday11.py
64 lines (50 loc) · 1.71 KB
/
day11.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
import numpy as np
from progressbar import ProgressBar
def power_up(serial_number: int) -> np.array:
grid = np.zeros((302, 302))
for y in range(1, 301):
for x in range(1, 301):
rack_id = x + 10
power = rack_id * y
power += serial_number
power *= rack_id
power_string = str(power)
if len(power_string) >= 3:
power = int(power_string[-3])
else:
power = 0
power -= 5
grid[y][x] = power
return grid
def find_best_powered_square(grid: np.array, size: int) -> (int, int, int):
max_power = 0
best_square = (0, 0)
for y in range(1, 301 - size):
for x in range(1, 301 - size):
power = np.sum(grid[y: y + size, x: x + size])
if power > max_power:
max_power = power
best_square = (x, y)
return best_square[0], best_square[1], max_power
def part1(serial_number: int) -> str:
grid = power_up(serial_number)
x, y, _ = find_best_powered_square(grid, 3)
return f'({x},{y})'
def part2(serial_number: int) -> str:
grid = power_up(serial_number)
max_power = 0
best_x, best_y, best_size = 0, 0, 0
with ProgressBar(max_value=300) as p:
for size in range(1, 301):
p.update(size)
x, y, power = find_best_powered_square(grid, size)
if power > max_power:
max_power = power
best_x, best_y, best_size = x, y, size
return f'{best_x},{best_y},{best_size}'
def main():
serial_number = 5535
print(f'Part 1: {part1(serial_number)}')
print(f'Part 2: {part2(serial_number)}')
if __name__ == "__main__":
main()