56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
from tools.aoc import AOCDay
|
|
from tools.coordinate import Coordinate
|
|
from tools.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
|