52 lines
1.2 KiB
Python
52 lines
1.2 KiB
Python
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) |