aoc2025/day09.py
2025-12-19 14:35:42 +01:00

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)