Advent of Code 2025
at main 1.0 kB view raw
1module Day4 where 2 3import qualified Data.Map as Map 4import Data.Map (Map) 5import Util 6 7parse :: String -> Grid 8parse = toGrid 9 10isOccupied :: Grid -> (Int,Int) -> Bool 11isOccupied grid p = Map.lookup p grid == Just '@' 12 13isAccessible :: Grid -> (Int,Int) -> Char -> Bool 14isAccessible grid p '@' = 15 length (filter (isOccupied grid) (neighbors8 p)) < 4 16isAccessible _ _ _ = False 17 18part1 :: String -> String 19part1 input = 20 let grid = parse input 21 in show $ 22 length $ 23 Map.filterWithKey (isAccessible grid) grid 24 25removeAccessible :: Grid -> Grid 26removeAccessible grid = 27 let accessible = Map.filterWithKey (isAccessible grid) grid 28 in Map.difference grid accessible 29 30removeAll :: Grid -> Grid 31removeAll grid = 32 let grids = iterate removeAccessible grid 33 stabilized (x : y : gs) = 34 if Map.size x == Map.size y then 35 x 36 else 37 stabilized (y : gs) 38 in stabilized grids 39 40part2 :: String -> String 41part2 input = 42 let grid = parse input 43 in show $ Map.size $ Map.difference grid (removeAll grid)