33import Criterion.Main
44import Data.Function
55import qualified Data.IntMap as IM
6- import Data.IntMap.Strict (IntMap )
6+ import Data.IntMap (IntMap )
77import Data.IntSet (IntSet )
88import qualified Data.IntSet as IS
99import Data.Map (Map )
1010import qualified Data.Map as M
11+ import Data.List
1112
1213type Grid = IntMap Int
1314
@@ -61,7 +62,7 @@ embig = concat . take 5 . iterate (map (map succW)) . map (concat . take 5 . ite
6162
6263type PQueue a = IntMap [a ]
6364
64- -- pminView :: PQueue a -> ((Key , a), PQueue a)
65+ pminView :: PQueue a -> ((Int , a ), PQueue a )
6566pminView p =
6667 let Just (l, p') = IM. minViewWithKey p
6768 in case l of
@@ -74,8 +75,8 @@ pins k x = IM.insertWith (++) k [x]
7475pempty :: PQueue a
7576pempty = IM. empty
7677
77- neighbors :: Grid -> Int -> IntSet
78- neighbors g p = IS. filter ( `IM.member` g) ( IS. fromList ( conv <$> [(x - 1 , y), (x, y + 1 ), (x + 1 , y), (x, y - 1 )]))
78+ neighbors :: Int -> [ Int ]
79+ neighbors p = conv <$> [(x - 1 , y), (x, y + 1 ), (x + 1 , y), (x, y - 1 )]
7980 where
8081 (x, y) = from p
8182
@@ -93,7 +94,7 @@ dijkstra g s = step1 & step2
9394 ((d, u), q') = pminView q
9495 unseen' = IS. delete u unseen
9596 -- for all neighbors of u, visit it and thread the distance map and priority queue
96- (dv', q'') = IS. foldl' visit (dv, q') (neighbors g u)
97+ (dv', q'') = foldl' visit (dv, q') (neighbors u)
9798 where
9899 -- to visit a point p', make sure it's in the graph
99100 visit (dv, q') p'
@@ -106,10 +107,13 @@ dijkstra g s = step1 & step2
106107 -- if it's better then update distance for p' in dv to be alt
107108 (dv'', q'') = if alt < dv IM. ! p' then (IM. insert p' alt dv, pins alt p' q') else (dv, q')
108109
110+ part1 :: (Grid , Int ) -> Int
109111part1 (inp, n) = dijkstra inp (conv (1 , 1 )) IM. ! conv (n, n)
110112
113+ part2 :: (Grid , Int ) -> Int
111114part2 = part1
112115
116+ main :: IO ()
113117main = do
114118 let dayNumber = 15 :: Int
115119 let dayString = " day" <> show dayNumber
0 commit comments