You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.3 KiB
49 lines
1.3 KiB
import os
|
|
from math import atan2
|
|
from typing import Tuple
|
|
|
|
inputfile = os.path.join(os.path.dirname(__file__), "input/day10_input")
|
|
|
|
|
|
def get_asteroids():
|
|
with open(inputfile) as fp:
|
|
lines = [x.rstrip() for x in fp.readlines()]
|
|
return [(x, y)
|
|
for y, line in enumerate(lines)
|
|
for x, m in enumerate(line)
|
|
if m == '#']
|
|
|
|
|
|
def calc_arc(origin: Tuple[int, int], target: Tuple[int, int]) -> float:
|
|
return atan2(target[0] - origin[0], target[1] - origin[1])
|
|
|
|
|
|
def test_day10a():
|
|
max = 0
|
|
found = (0, 0)
|
|
asts = get_asteroids()
|
|
for my in asts:
|
|
angles = {calc_arc(my, target) for target in asts}
|
|
if len(angles) > max:
|
|
max = len(angles)
|
|
found = my
|
|
|
|
print(f'Station is at {found} with {max} visible asteroids')
|
|
assert max == 303
|
|
|
|
|
|
def test_day10b():
|
|
station = (26, 29)
|
|
res = None
|
|
count = 0
|
|
asts = get_asteroids()
|
|
asts.remove(station)
|
|
while not res:
|
|
angles = {calc_arc(station, target): target for target in asts}
|
|
for ang in sorted(angles.keys(), reverse=True):
|
|
asts.remove(angles[ang])
|
|
count += 1
|
|
if count == 200:
|
|
res = angles[ang]
|
|
break
|
|
assert res[0] * 100 + res[1] == 408
|
|
|