advent of code 2025

day 4 part 2

kot.pink 04e3f385 f50d2e4c

verified
+34 -19
+34 -19
4.py
··· 1 1 import sys 2 + from typing import List, Optional, Tuple 2 3 3 - available_rolls = 0 4 + removed_rolls = 0 4 5 file = '4.input' if len(sys.argv) <= 1 else sys.argv[1] 5 - grid = list(map(str.strip, open(file).readlines())) 6 + grid = list(map(list, map(str.strip, open(file).readlines()))) 6 7 7 - def check_occupied(y: int, x: int) -> int: 8 + def check_occupied(y: int, x: int) -> Optional[Tuple[int, int]]: 8 9 try: 9 - return x >= 0 and y >= 0 and grid[y][x] == "@" 10 - except IndexError: 11 - return False 10 + if x >= 0 and y >= 0 and grid[y][x] == "@": 11 + return (y, x) 12 + except IndexError: pass 13 + return None 14 + 15 + def compute_adj(y: int, x: int) -> List[Optional[Tuple[int, int]]]: 16 + return [ 17 + check_occupied(y-1, x-1), check_occupied(y-1, x), check_occupied(y-1, x+1), 18 + check_occupied(y, x-1), check_occupied(y, x+1), 19 + check_occupied(y+1, x-1), check_occupied(y+1, x), check_occupied(y+1, x+1) 20 + ] 21 + 22 + def search_removable() -> List[Tuple[int, int]]: 23 + removable = [] 24 + for y in range(len(grid)): 25 + for x in range(len(grid[y])): 26 + if grid[y][x] != "@": continue 27 + adj = compute_adj(y, x) 28 + if sum(map(bool, adj)) < 4: 29 + removable.append((y, x)) 30 + return removable 12 31 13 - for y in range(len(grid)): 14 - row = grid[y] 15 - for x in range(len(row)): 16 - if row[x] != "@": continue 17 - adj = sum([ 18 - check_occupied(y-1, x-1), check_occupied(y-1, x), check_occupied(y-1, x+1), 19 - check_occupied(y, x-1), check_occupied(y, x+1), 20 - check_occupied(y+1, x-1), check_occupied(y+1, x), check_occupied(y+1, x+1) 21 - ]) 22 - if adj < 4: 23 - available_rolls += 1 32 + removable = search_removable() 33 + print(f'p1: {len(removable)}') 34 + 35 + while len(removable): 36 + for (y, x) in removable: 37 + grid[y][x] = "." 38 + removed_rolls += 1 39 + removable = search_removable() 24 40 25 - print(f'p1: {available_rolls}') 26 - # print(f'p2: {}') 41 + print(f'p2: {removed_rolls}')