module Day4 where import qualified Data.Map as Map import Data.Map (Map) import Util parse :: String -> Grid parse = toGrid isOccupied :: Grid -> (Int,Int) -> Bool isOccupied grid p = Map.lookup p grid == Just '@' isAccessible :: Grid -> (Int,Int) -> Char -> Bool isAccessible grid p '@' = length (filter (isOccupied grid) (neighbors8 p)) < 4 isAccessible _ _ _ = False part1 :: String -> String part1 input = let grid = parse input in show $ length $ Map.filterWithKey (isAccessible grid) grid removeAccessible :: Grid -> Grid removeAccessible grid = let accessible = Map.filterWithKey (isAccessible grid) grid in Map.difference grid accessible removeAll :: Grid -> Grid removeAll grid = let grids = iterate removeAccessible grid stabilized (x : y : gs) = if Map.size x == Map.size y then x else stabilized (y : gs) in stabilized grids part2 :: String -> String part2 input = let grid = parse input in show $ Map.size $ Map.difference grid (removeAll grid)