From cb5b2b97e0638d2e346124787d37efe5e24a9e19 Mon Sep 17 00:00:00 2001 From: Holly McFarland Date: Sat, 6 Dec 2025 15:12:44 -0500 Subject: [PATCH] day 4 --- day-04/part-1.py | 52 +++++++++++++++++++++++++++++++++++++++++++ day-04/part-2.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 day-04/part-1.py create mode 100644 day-04/part-2.py diff --git a/day-04/part-1.py b/day-04/part-1.py new file mode 100644 index 0000000..6d27b66 --- /dev/null +++ b/day-04/part-1.py @@ -0,0 +1,52 @@ +import aocd + +from enum import Enum + +class Direction(complex, Enum): + NORTH = -1j + SOUTH = 1j + EAST = -1 + WEST = 1 + NORTHWEST = NORTH+WEST + NORTHEAST = NORTH+EAST + SOUTHWEST = SOUTH+WEST + SOUTHEAST = SOUTH+EAST + +class Paper: + def __init__(self, x, y, floor): + self.coords = complex(real=x, imag=y) + self.floor = floor + + @property + def x(self): + return int(self.coords.real) + + @property + def y(self): + return int(self.coords.imag) + + @property + def neighbours(self): + yield from filter(None, (self.floor.get(self.coords + dir) for dir in Direction)) + +def parse(data): + floor = {} + + for y, line in enumerate(data.split('\n')): + for x, char in enumerate(line): + if char == '@': + floor[complex(real=x, imag=y)] = Paper(x, y, floor) + + return floor + +def is_accessible(paper): + return sum(1 for _ in paper.neighbours) < 4 + +def main(data): + floor = parse(data.strip()) + return sum(is_accessible(paper) for paper in floor.values()) + +if __name__ == '__main__': + solution = main(aocd.get_data(day=4, year=2025)) + print(solution) + aocd.submit(solution, part='a', day=4, year=2025) \ No newline at end of file diff --git a/day-04/part-2.py b/day-04/part-2.py new file mode 100644 index 0000000..105cfc1 --- /dev/null +++ b/day-04/part-2.py @@ -0,0 +1,57 @@ +import aocd + +from enum import Enum + +class Direction(complex, Enum): + NORTH = -1j + SOUTH = 1j + EAST = -1 + WEST = 1 + NORTHWEST = NORTH+WEST + NORTHEAST = NORTH+EAST + SOUTHWEST = SOUTH+WEST + SOUTHEAST = SOUTH+EAST + +class Paper: + def __init__(self, x, y, floor): + self.coords = complex(real=x, imag=y) + self.floor = floor + + @property + def x(self): + return int(self.coords.real) + + @property + def y(self): + return int(self.coords.imag) + + @property + def neighbours(self): + yield from filter(None, (self.floor.get(self.coords + dir) for dir in Direction)) + +def parse(data): + floor = {} + + for y, line in enumerate(data.split('\n')): + for x, char in enumerate(line): + if char == '@': + floor[complex(real=x, imag=y)] = Paper(x, y, floor) + + return floor + +def is_accessible(paper): + return sum(1 for _ in paper.neighbours) < 4 + +def main(data): + floor = parse(data.strip()) + total = 0 + while (removable := set(paper for paper in floor.values() if is_accessible(paper))): + total += len(removable) + for paper in removable: + del floor[paper.coords] + return total + +if __name__ == '__main__': + solution = main(aocd.get_data(day=4, year=2025)) + print(solution) + aocd.submit(solution, part='b', day=4, year=2025) \ No newline at end of file