mirror of
https://github.com/thib8956/advent-of-code.git
synced 2026-05-25 19:53:26 +00:00
2025 day 4
This commit is contained in:
@@ -0,0 +1,64 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import fileinput
|
||||||
|
from collections import deque
|
||||||
|
|
||||||
|
DIRECTIONS = [
|
||||||
|
0 - 1j, # NORTH
|
||||||
|
1 - 1j, # NORTHEAST
|
||||||
|
1 + 0j, # EAST
|
||||||
|
1 + 1j, # SOUTHEAST
|
||||||
|
0 + 1j, # SOUTH
|
||||||
|
-1 + 1j, # SOUTHWEST
|
||||||
|
-1 + 0j, # WEST
|
||||||
|
-1 - 1j, # NORTHWEST
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def parse_grid(lines):
|
||||||
|
grid = set()
|
||||||
|
for y, line in enumerate(lines):
|
||||||
|
for x, c in enumerate(line):
|
||||||
|
if c == "@":
|
||||||
|
grid.add(complex(x, y))
|
||||||
|
return grid
|
||||||
|
|
||||||
|
|
||||||
|
def can_be_accessed(roll, grid):
|
||||||
|
"""
|
||||||
|
The forklifts can only access a roll of paper if there are fewer than four
|
||||||
|
rolls of paper in the eight adjacent positions.
|
||||||
|
"""
|
||||||
|
total = sum(1 for direction in DIRECTIONS if roll + direction in grid)
|
||||||
|
return total < 4
|
||||||
|
|
||||||
|
|
||||||
|
def main(inp):
|
||||||
|
# Part 1
|
||||||
|
grid = parse_grid(inp)
|
||||||
|
total = 0
|
||||||
|
total = sum(1 for roll in grid if can_be_accessed(roll, grid))
|
||||||
|
print(f"Part 1: {total}")
|
||||||
|
|
||||||
|
# Part 2
|
||||||
|
total = 0
|
||||||
|
# use a queue to avoid rechecking all rolls each iteration
|
||||||
|
# we only check rolls that are adjacent to a roll that was removed
|
||||||
|
accessible_queue = deque(roll for roll in grid if can_be_accessed(roll, grid))
|
||||||
|
while accessible_queue:
|
||||||
|
roll = accessible_queue.popleft()
|
||||||
|
if roll not in grid:
|
||||||
|
continue # roll was already removed
|
||||||
|
|
||||||
|
total += 1
|
||||||
|
grid.remove(roll)
|
||||||
|
# check if new rolls are accessible
|
||||||
|
for direction in DIRECTIONS:
|
||||||
|
neighbor = roll + direction
|
||||||
|
if neighbor in grid and can_be_accessed(neighbor, grid):
|
||||||
|
accessible_queue.append(neighbor)
|
||||||
|
print(f"Part 2: {total}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
lines = [x.rstrip() for x in fileinput.input()]
|
||||||
|
main(lines)
|
||||||
Reference in New Issue
Block a user