This commit is contained in:
thornAvery 2021-12-09 21:55:42 +00:00
parent 254aaef3cd
commit a8403b76f2
2 changed files with 0 additions and 66 deletions

View file

@ -1,7 +1,6 @@
module Main where module Main where
import Data.List import Data.List
import Debug.Trace
import qualified Data.Map as M import qualified Data.Map as M
mkAdjList :: Int -> Int -> AdjList mkAdjList :: Int -> Int -> AdjList

View file

@ -1,65 +0,0 @@
module Main where
import Data.List
import Debug.Trace
import qualified Data.Map as M
mkAdjList :: Int -> Int -> AdjList
mkAdjList w h = M.fromList $
map (\p -> (,) p (mkDeltas w h p)) $
[ (x,y) | x <- xr, y <- yr ]
where
xr = [0..(w-1)]
yr = [0..(h-1)]
mkValList :: [[Int]] -> ValList
mkValList [] = M.empty
mkValList rows = M.fromList $ concat $ map f $ zip [0..] rows
where
f (i,v) = map (g i) $ zip [0..] v
g i (j,v) = ((j,i), v)
mkDeltas :: Int -> Int -> (Int,Int) -> [(Int,Int)]
mkDeltas w h (x,y) = filter
(\(i,j) -> (i >= 0 && i < w && j >= 0 && j < h))
[ ((x-1),y)
, ((x+1),y)
, (x,(y-1))
, (x,(y+1))
]
main :: IO ()
main = do
raw <- getContents
let input = map (map (read . (:[]))) $ lines raw
al = mkAdjList (length (head input)) (length input)
vl = mkValList input
in do
putStrLn $ "day8a: " ++ (show $ solveA al vl)
putStrLn $ "day8b: " ++ (show $ solveB al vl)
type AdjList = M.Map (Int,Int) [(Int,Int)]
type ValList = M.Map (Int,Int) Int
solveA :: AdjList -> ValList -> Int
solveA al vl = sum $ map (1 +) $ (findVals vl) (findMinima al vl)
solveB :: AdjList -> ValList -> Int
solveB al vl = product $ take 3 $ (reverse . sort) $ map (length . nub) $
map (findConnected al vl) $ (findMinima al vl)
findConnected :: AdjList -> ValList -> (Int,Int) -> [(Int,Int)]
findConnected al vl p = (:) p $ concat (map (findConnected al vl) $ (filter f (al M.! p)))
where
f q = (vl M.! p) < (vl M.! q) && (vl M.! q) /= 9
mlookup :: Ord k => M.Map k a -> k -> Maybe a
mlookup = flip M.lookup
findMinima :: AdjList -> ValList -> [(Int,Int)]
findMinima al vl = filter f $ M.keys vl
where
f p = all (> (vl M.! p)) $ map (vl M.!) $ al M.! p
findVals :: ValList -> [(Int,Int)] -> [Int]
findVals vl cs = [ x | Just x <- map (mlookup vl) cs ]