aoc2019/day10.py
2021-12-27 17:31:33 +01:00

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)