aboutsummaryrefslogtreecommitdiff
path: root/day6/solve.py
blob: 8887c7d93729634cbc26226abd4e724672a88293 (plain)
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
from collections import defaultdict

import numpy as np

from commons import get_input, remove_empty


def manhattan_dist(p0, p1):
    return abs(p0[0] - p1[0]) + abs(p0[1] - p1[1])


def find_nearest_point_and_distances(x, y):
    min_point = -1
    min_dist = 1000000
    sum_dists = 0
    for i, p in enumerate(points):
        dist = manhattan_dist((x, y), p)
        sum_dists += dist
        if dist == min_dist:
            min_dist = -1
        if dist < min_dist:
            min_dist = dist
            min_point = i
    return min_point, sum_dists


def fill_grid():
    global safe_points
    for i in range(size):
        for j in range(size):
            min_dist, sum_dist = find_nearest_point_and_distances(i, j)
            grid[i, j] = min_dist
            if sum_dist < 10_000:
                safe_points += 1


def find_infinite_areas():
    for i in range(size):
        infinite_areas.add(grid[0, i])
        infinite_areas.add(grid[size - 1, i])
        infinite_areas.add(grid[i, 0])
        infinite_areas.add(grid[i, size - 1])


def find_counts():
    for i in range(size):
        for j in range(size):
            ar = grid[i, j]
            if ar in infinite_areas:
                continue
            counts[ar] += 1


points = [tuple(int(co.strip()) + 1 for co in line.split(',')) for line in remove_empty(get_input(6).split('\n'))]
size = max(map(max, points))
grid = np.zeros((size, size), dtype=int)
infinite_areas = set()
safe_points = 0
counts = defaultdict(int)
fill_grid()
find_infinite_areas()
find_counts()
biggest_area = max(counts.values())

if __name__ == '__main__':
    print("first:", biggest_area)
    print("second:", safe_points)