Advent of Code 2025
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)