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)
|