diff options
-rw-r--r-- | day6/solve.py | 67 | ||||
-rw-r--r-- | requirements.txt | 1 |
2 files changed, 68 insertions, 0 deletions
diff --git a/day6/solve.py b/day6/solve.py new file mode 100644 index 0000000..8887c7d --- /dev/null +++ b/day6/solve.py @@ -0,0 +1,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) diff --git a/requirements.txt b/requirements.txt index 1928e4c..63c07b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ requests antlr4-python3-runtime +numpy |