From 39090d4e947f34e1f3bff372f5eb5f1b3f830dd8 Mon Sep 17 00:00:00 2001 From: Dece Date: Sun, 15 Dec 2019 18:42:31 +0100 Subject: [PATCH] Day 10: much more efficient solution --- 2019/day10.py | 47 ++++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/2019/day10.py b/2019/day10.py index 749bd84..bd6c4b9 100644 --- a/2019/day10.py +++ b/2019/day10.py @@ -1,46 +1,31 @@ import math +import numpy as np + def main(): with open("day10.txt", "rt") as input_file: amap = [line.rstrip() for line in input_file.readlines()] - ast_positions = [] - for x, line in enumerate(amap): - for y, value in enumerate(line): + asteroids = [] + for y, line in enumerate(amap): + for x, value in enumerate(line): if value == "#": - ast_positions.append((x, y)) + asteroids.append((x, y)) best_vis = 0 - for pos in ast_positions: - best_vis = max(best_vis, num_visible_asts(ast_positions, pos)) - - print("Best visibility is", best_vis) + best_pos = None + for pos in asteroids: + vis = num_visible_asts(asteroids, pos) + if vis > best_vis: + best_vis, best_pos = vis, pos + print(f"Best visibility is {best_vis} at {best_pos}.") def num_visible_asts(asts, ref): - count = 0 - for ast in asts: - if ast[0] == ref[0] and ast[1] == ref[1]: - continue - if is_visible(asts, ref, ast): - count += 1 - return count - -def is_visible(asts, ref, target): - for ast in asts: - if ast[0] == ref[0] and ast[1] == ref[1]: - continue - if ast[0] == target[0] and ast[1] == target[1]: - continue - if is_on_line(ref, target, ast): - return False - return True - -def is_on_line(a, b, p): - return math.isclose(dist(a, b), dist(a, p) + dist(b, p)) - -def dist(a, b): - return math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2) + asts = asts.copy() + asts.remove(ref) + angles = [np.angle(np.complex(ast[0] - ref[0], ast[1] - ref[1])) for ast in asts] + return len(set(angles)) if __name__ == "__main__":