generated from public/aoc_template
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
from soupsieve import closest
|
|
from tools.coordinate import Coordinate, DistanceAlgorithm
|
|
|
|
my_input = open("inputs/input5", "r").read().splitlines()
|
|
my_pos = Coordinate(0, 0)
|
|
coords = []
|
|
for line in my_input:
|
|
x, y = line.split(", ")
|
|
coords.append(Coordinate(int(x[1:]), int(y[:-1])))
|
|
|
|
p3 = 0
|
|
|
|
|
|
def get_closest_to(start: Coordinate, exclude: list[Coordinate] = None) -> Coordinate:
|
|
if exclude is None:
|
|
exclude = []
|
|
|
|
closest_coord = None
|
|
closest_dist = int(1e10)
|
|
for c in coords:
|
|
if c == start or c in exclude:
|
|
continue
|
|
|
|
next_dist = c.getDistanceTo(closest, algorithm=DistanceAlgorithm.MANHATTAN, includeDiagonals=False)
|
|
if next_dist < closest_dist:
|
|
closest_dist = next_dist
|
|
closest_coord = c
|
|
|
|
return closest_coord
|
|
|
|
|
|
min_dist = int(1e10)
|
|
max_dist = 0
|
|
closest = None
|
|
for c in coords:
|
|
dist = Coordinate(0, 0).getDistanceTo(c, algorithm=DistanceAlgorithm.MANHATTAN, includeDiagonals=False)
|
|
if min_dist > dist:
|
|
min_dist = dist
|
|
closest = c
|
|
max_dist = max(max_dist, dist)
|
|
|
|
p1 = max_dist - min_dist
|
|
p2 = closest.getDistanceTo(get_closest_to(closest), algorithm=DistanceAlgorithm.MANHATTAN, includeDiagonals=False)
|
|
p3 = my_pos.getDistanceTo(closest, algorithm=DistanceAlgorithm.MANHATTAN, includeDiagonals=False)
|
|
visited = [closest]
|
|
while len(visited) < len(coords):
|
|
next_island = get_closest_to(closest, exclude=visited)
|
|
p3 += next_island.getDistanceTo(closest, algorithm=DistanceAlgorithm.MANHATTAN, includeDiagonals=False)
|
|
visited.append(next_island)
|
|
closest = next_island
|
|
|
|
print(p1)
|
|
print(p2)
|
|
print(p3)
|