73 lines
1.9 KiB
Python
73 lines
1.9 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):
|
|
inputs = [
|
|
[
|
|
(8, "test_input10_1_0"),
|
|
(33, "test_input10_1_1"),
|
|
(35, "test_input10_1_2"),
|
|
(41, "test_input10_1_3"),
|
|
(210, "test_input10_1_4"),
|
|
(267, "input10")
|
|
],
|
|
[
|
|
(802, "test_input10_2_0"),
|
|
(1309, "input10")
|
|
]
|
|
]
|
|
|
|
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
|
|
|
|
|
|
if __name__ == '__main__':
|
|
day = Day(2019, 10)
|
|
day.run(verbose=True)
|