22
22
-- will recommend what should go in place of the underscores.
23
23
24
24
module AOC.Challenge.Day15 (
25
- -- day15a
26
- -- , day15b
25
+ day15a
26
+ , day15b
27
27
) where
28
28
29
29
import AOC.Prelude
@@ -44,17 +44,48 @@ import qualified Linear as L
44
44
import qualified Text.Megaparsec as P
45
45
import qualified Text.Megaparsec.Char as P
46
46
import qualified Text.Megaparsec.Char.Lexer as PP
47
+ import AOC.Common.Search
47
48
48
49
day15a :: _ :~> _
49
50
day15a = MkSol
50
- { sParse = Just . lines
51
+ { sParse = Just . parseAsciiMap digitToIntSafe
51
52
, sShow = show
52
- , sSolve = Just
53
+ , sSolve = \ mp ->
54
+ let targ = fst $ M. findMax mp
55
+ in fst <$> aStar
56
+ (mannDist targ)
57
+ (M. fromSet (\ x -> mp M. ! x) . (`S.intersection` M. keysSet mp) . cardinalNeighbsSet)
58
+ 0
59
+ (== targ)
53
60
}
54
61
62
+ -- aStar
63
+ -- :: forall n p. (Ord n, Ord p, Num p)
64
+ -- => (n -> p) -- ^ heuristic
65
+ -- -> (n -> Map n p) -- ^ neighborhood
66
+ -- -> n -- ^ start
67
+ -- -> (n -> Bool) -- ^ target
68
+ -- -> Maybe (p, [n]) -- ^ the shortest path, if it exists, and its cost
69
+
55
70
day15b :: _ :~> _
56
71
day15b = MkSol
57
72
{ sParse = sParse day15a
58
73
, sShow = show
59
- , sSolve = Just
74
+ , sSolve = \ mp0 ->
75
+ let mp = M. fromList
76
+ [ (k', v')
77
+ | (k, v) <- M. toList mp0
78
+ , dx <- [0 ,1 ,2 ,3 ,4 ]
79
+ , dy <- [0 ,1 ,2 ,3 ,4 ]
80
+ , let k' = k + V2 (shifter * dx) (shifter * dy)
81
+ , let v' = ((v - 1 + dx+ dy) `mod` 9 ) + 1
82
+ ]
83
+ corner = fst $ M. findMax mp0
84
+ V2 shifter _ = corner + 1
85
+ targ = fst $ M. findMax mp
86
+ in fst <$> aStar
87
+ (mannDist targ)
88
+ (M. fromSet (\ x -> mp M. ! x) . (`S.intersection` M. keysSet mp) . cardinalNeighbsSet)
89
+ 0
90
+ (== targ)
60
91
}
0 commit comments