aoc2019/day10.py
2021-12-01 03:07:11 +01:00

56 lines
1.6 KiB
Python

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