aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--day6/solve.py67
-rw-r--r--requirements.txt1
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