59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
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)
|