import Data.Char import Data.List import Data.Array main :: IO () main = do input <- readFile "input" let grid = makeGrid (lines input) print $ part1 grid print $ part2 grid part1 grid = let heads = filter (\p -> grid!p == 0) (indices grid) in sum $ map (getScore grid) heads part2 grid = let heads = filter (\p -> grid!p == 0) (indices grid) in sum $ map (getRating grid) heads getScore grid pos = length $ nub $ find9s grid 0 pos getRating grid pos = length $ find9s grid 0 pos find9s grid 9 pos = if (grid!pos) == 9 then [pos] else [] find9s grid i pos = let neigh = getNeighbours grid pos next = filter (\p -> (grid!p) == i+1) neigh in concatMap (find9s grid (i+1)) next getNeighbours arr (i,j) = filter (inRange (bounds arr)) [(i-1,j),(i+1,j),(i,j-1),(i,j+1)] makeGrid :: [String] -> Array (Int, Int) Int makeGrid grid = array bounds elements where n = length grid m = length (head grid) bounds = ((0,0), (n-1,m-1)) elements = [((i,j), digitToInt (grid!!i!!j)) | i <- [0..n-1], j <- [0..m-1]]