80 lines
2 KiB
Python
80 lines
2 KiB
Python
from lib import *
|
|
|
|
input = read_input(2019, 10)
|
|
|
|
|
|
grid = input.splitlines()
|
|
height = len(grid)
|
|
width = len(grid[0])
|
|
assert all(width == len(l) for l in grid)
|
|
|
|
|
|
def check(x, y, x2, y2):
|
|
steps = math.gcd(abs(x2 - x), abs(y2 - y))
|
|
xstep = (x2 - x) // steps
|
|
ystep = (y2 - y) // steps
|
|
for _ in range(steps - 1):
|
|
x += xstep
|
|
y += ystep
|
|
if grid[y][x] == "#":
|
|
return False
|
|
return True
|
|
|
|
|
|
def count(x, y):
|
|
out = 0
|
|
for y2 in range(height):
|
|
for x2 in range(width):
|
|
if (x != x2 or y != y2) and grid[y2][x2] == "#" and check(x, y, x2, y2):
|
|
out += 1
|
|
return out
|
|
|
|
|
|
print(max(count(x, y) for y in range(height) for x in range(width) if grid[y][x] == "#"))
|
|
|
|
(*grid,) = map(list, input.splitlines())
|
|
height = len(grid)
|
|
width = len(grid[0])
|
|
|
|
|
|
def calc_angle(x, y):
|
|
if not x:
|
|
return 0
|
|
return math.atan(y / x) * math.pi / 180 + 90
|
|
|
|
|
|
def check(x, y, x2, y2):
|
|
steps = math.gcd(abs(x2 - x), abs(y2 - y))
|
|
xstep = (x2 - x) // steps
|
|
ystep = (y2 - y) // steps
|
|
for _ in range(steps - 1):
|
|
x += xstep
|
|
y += ystep
|
|
if grid[y][x] == "#":
|
|
return False
|
|
return True
|
|
|
|
|
|
def count(x, y):
|
|
out = 0
|
|
for y2 in range(height):
|
|
for x2 in range(width):
|
|
if (x != x2 or y != y2) and grid[y2][x2] == "#" and check(x, y, x2, y2):
|
|
out += 1
|
|
return out
|
|
|
|
|
|
asteroids = [(x, y) for y in range(height) for x in range(width) if grid[y][x] == "#"]
|
|
lx, ly = max(asteroids, key=lambda a: count(*a))
|
|
asteroids.remove((lx, ly))
|
|
asteroid_vaporization_queue = []
|
|
while asteroids:
|
|
visible = [asteroid for asteroid in asteroids if check(lx, ly, *asteroid)]
|
|
visible.sort(key=lambda a: calc_angle(a[0] - lx, a[1] - ly))
|
|
for asteroid in visible:
|
|
x, y = asteroid
|
|
asteroid_vaporization_queue.append(asteroid)
|
|
asteroids.remove(asteroid)
|
|
grid[y][x] = "."
|
|
x, y = asteroid_vaporization_queue[199]
|
|
print(x * 100 + y)
|