from aoc import AOCDay from coordinate import Coordinate from grid import Grid from typing import Any, List def radarPing(grid: Grid, origin: Coordinate) -> List[Coordinate]: angleList = {} for asteroid in grid.getActiveCells(): if asteroid == origin: continue angle = origin.getAngleTo(asteroid, normalized=True) if angle in angleList and origin.getDistanceTo(asteroid) > origin.getDistanceTo(angleList[angle]): continue angleList[angle] = asteroid return [angleList[k] for k in sorted(angleList.keys())] def getMaxAsteroidsSeen(grid: Grid) -> (Coordinate, int): maxSeen = [] maxCoord = None for check in grid.getActiveCells(): asteroids_seen = radarPing(grid, check) if len(asteroids_seen) > len(maxSeen): maxSeen = asteroids_seen maxCoord = check return maxCoord, len(maxSeen) class Day(AOCDay): test_solutions_p1 = [8, 33, 35, 41, 210] test_solutions_p2 = [802] def part1(self) -> Any: grid = Grid() for y, l in enumerate(self.getInput()): for x, c in enumerate(l): grid.set(Coordinate(x, y), c == '#') return getMaxAsteroidsSeen(grid)[1] def part2(self) -> Any: grid = Grid() for y, l in enumerate(self.getInput()): for x, c in enumerate(l): grid.set(Coordinate(x, y), c == '#') asteroids_seen = radarPing(grid, getMaxAsteroidsSeen(grid)[0]) twohundreth = asteroids_seen[199] return twohundreth.x * 100 + twohundreth.y