generated from public/aoc_template
86 lines
2.5 KiB
Python
86 lines
2.5 KiB
Python
from itertools import combinations
|
|
from tools.aoc import AOCDay
|
|
from tools.coordinate import Polygon, Coordinate, Line
|
|
from typing import Any
|
|
|
|
|
|
|
|
class Day(AOCDay):
|
|
inputs = [
|
|
[
|
|
(50, "input9_test"),
|
|
(4745816424, "input9_dennis"),
|
|
(4737096935, "input9"),
|
|
],
|
|
[
|
|
(24, "input9_test"),
|
|
(1351617690, "input9_dennis"),
|
|
(1644094530, "input9"),
|
|
]
|
|
]
|
|
|
|
def part1(self) -> Any:
|
|
tiles = [tuple(map(int, line.split(","))) for line in self.getInput()]
|
|
|
|
ans = 0
|
|
for pair in combinations(tiles, 2):
|
|
area = (abs(pair[0][0] - pair[1][0]) + 1) * (abs(pair[0][1] - pair[1][1]) + 1)
|
|
if area > ans:
|
|
ans = area
|
|
|
|
return ans
|
|
|
|
def part2(self) -> Any:
|
|
tiles: list[Coordinate] = [Coordinate(*map(int, line.split(","))) for line in self.getInput()]
|
|
p = Polygon(tiles)
|
|
|
|
ans = 0
|
|
decomposed = list(p.decompose())
|
|
for pair in combinations(tiles, 2):
|
|
found_tile_inside = False
|
|
for x in tiles:
|
|
if min(pair[0][0], pair[1][0]) < x[0] < max(pair[0][0], pair[1][0]) and min(pair[0][1], pair[1][1]) < x[1] < max(pair[0][1], pair[1][1]):
|
|
#print("IGNORE", other_corner, last_tile, tile, "=>", x)
|
|
found_tile_inside = True
|
|
break
|
|
|
|
if found_tile_inside:
|
|
continue
|
|
|
|
|
|
found_tile_outside = False
|
|
for c in [Coordinate(pair[0][0], pair[0][1]), Coordinate(pair[1][0], pair[1][1]), Coordinate(pair[0][0], pair[1][1]), Coordinate(pair[1][0], pair[0][1])]:
|
|
found_tile_inside = False
|
|
for r in decomposed:
|
|
if c in r:
|
|
found_tile_inside = True
|
|
|
|
if not found_tile_inside:
|
|
found_tile_outside = True
|
|
if found_tile_outside:
|
|
continue
|
|
|
|
|
|
found_intersection = False
|
|
p_line = Line(pair[0], pair[1])
|
|
for l in p.lines:
|
|
if l.start in pair or l.end in pair:
|
|
continue
|
|
if l.intersects(p_line):
|
|
found_intersection = True
|
|
break
|
|
|
|
if found_intersection:
|
|
continue
|
|
|
|
area = (abs(pair[0][0] - pair[1][0]) + 1) * (abs(pair[0][1] - pair[1][1]) + 1)
|
|
if area > ans:
|
|
ans = area
|
|
|
|
return ans
|
|
|
|
|
|
if __name__ == '__main__':
|
|
day = Day(2025, 9)
|
|
day.run(verbose=True)
|