3
3
import Criterion.Main
4
4
import Data.Function
5
5
import qualified Data.IntMap as IM
6
- import Data.IntMap.Strict (IntMap )
6
+ import Data.IntMap (IntMap )
7
7
import Data.IntSet (IntSet )
8
8
import qualified Data.IntSet as IS
9
9
import Data.Map (Map )
10
10
import qualified Data.Map as M
11
+ import Data.List
11
12
12
13
type Grid = IntMap Int
13
14
@@ -61,7 +62,7 @@ embig = concat . take 5 . iterate (map (map succW)) . map (concat . take 5 . ite
61
62
62
63
type PQueue a = IntMap [a ]
63
64
64
- -- pminView :: PQueue a -> ((Key , a), PQueue a)
65
+ pminView :: PQueue a -> ((Int , a ), PQueue a )
65
66
pminView p =
66
67
let Just (l, p') = IM. minViewWithKey p
67
68
in case l of
@@ -74,8 +75,8 @@ pins k x = IM.insertWith (++) k [x]
74
75
pempty :: PQueue a
75
76
pempty = IM. empty
76
77
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 )]
79
80
where
80
81
(x, y) = from p
81
82
@@ -93,7 +94,7 @@ dijkstra g s = step1 & step2
93
94
((d, u), q') = pminView q
94
95
unseen' = IS. delete u unseen
95
96
-- 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)
97
98
where
98
99
-- to visit a point p', make sure it's in the graph
99
100
visit (dv, q') p'
@@ -106,10 +107,13 @@ dijkstra g s = step1 & step2
106
107
-- if it's better then update distance for p' in dv to be alt
107
108
(dv'', q'') = if alt < dv IM. ! p' then (IM. insert p' alt dv, pins alt p' q') else (dv, q')
108
109
110
+ part1 :: (Grid , Int ) -> Int
109
111
part1 (inp, n) = dijkstra inp (conv (1 , 1 )) IM. ! conv (n, n)
110
112
113
+ part2 :: (Grid , Int ) -> Int
111
114
part2 = part1
112
115
116
+ main :: IO ()
113
117
main = do
114
118
let dayNumber = 15 :: Int
115
119
let dayString = " day" <> show dayNumber
0 commit comments