from tools.aoc import AOCDay from typing import Any from tools.coordinate import Coordinate, Shape, Square from tools.grid import Grid class Day(AOCDay): inputs = [ [ (4, "test_input3"), (121259, "input3") ], [ (3, "test_input3"), (239, "input3") ] ] def getClaims(self) -> (int, int, int, int, int): # claim_id, x, y, width, height for claim in self.getInput(): v = claim.split() claim_id = int(v[0][1:]) x, y = map(int, v[2][:-1].split(",")) wx, wy = map(int, v[3].split("x")) yield claim_id, x, y, wx, wy def part1(self) -> Any: grid = Grid(0) for _, x, y, wx, wy in self.getClaims(): for dx in range(wx): for dy in range(wy): grid.add(Coordinate(x + dx, y + dy)) return len(list(x for x in grid.getActiveCells() if grid.get(x) > 1)) def part2(self) -> Any: claims = [] for claim_id, x, y, wx, wy in self.getClaims(): claims.append((claim_id, Square(Coordinate(x, y), Coordinate(x + wx - 1, y + wy - 1)))) for claim_id, claim in enumerate(claims): intersect = False for sub_claim_id, sub_claim in claims: if sub_claim_id == claim_id: continue if claim & sub_claim: intersect = True break if not intersect: return claim_id if __name__ == '__main__': day = Day(2018, 3) day.run(verbose=True)