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)