aoc2023/day18.py
2024-01-01 21:35:18 +01:00

57 lines
1.5 KiB
Python

from __future__ import annotations
from tools.aoc import AOCDay
from tools.coordinate import Coordinate, Polygon
from typing import Any, Iterable
DIRECTIONS = [Coordinate(1, 0), Coordinate(0, 1), Coordinate(-1, 0), Coordinate(0, -1)]
DIR_TRANS = {"R": 0, "D": 1, "L": 2, "U": 3}
class Day(AOCDay):
inputs = [
[
(62, "input18_test"),
(237, "input18_test2"),
(227, "input18_test3"),
(54, "input18_test4"),
(50603, "input18"),
],
[
(952408144115, "input18_test"),
(96556251590677, "input18"),
],
]
def parse_input(self, part2: bool = False) -> Iterable[tuple[int, int]]:
for line in self.getInput():
d, s, c = line.split()
if not part2:
yield DIR_TRANS[d], int(s)
else:
yield int(c[-2]), int(c[2:-2], 16)
def get_lagoon_area(self, part2: bool = False) -> int:
start = Coordinate(0, 0)
points = []
perimeter = 0
for d, l in self.parse_input(part2):
perimeter += l
end = start + DIRECTIONS[d] * l
points.append(end)
start = end
p = Polygon(points)
a = abs(p.get_area())
return int(p.get_area()) + perimeter // 2 + 1
def part1(self) -> Any:
return self.get_lagoon_area()
def part2(self) -> Any:
return self.get_lagoon_area(part2=True)
if __name__ == "__main__":
day = Day(2023, 18)
day.run(verbose=True)