X-Git-Url: https://git.njae.me.uk/?p=advent-of-code-19.git;a=blobdiff_plain;f=advent18%2Fsrc%2Fadvent18direct.hs;h=346e61f268eedbb64f7c7d19d17d9d057e131389;hp=3d6125e48c41879b27cd1ba477320a401b0454ba;hb=f0d22f1976f3c65c6adc251a637b106ec3e002e3;hpb=09d448be7cd1dc2dd32ce632b0732d007279bf32 diff --git a/advent18/src/advent18direct.hs b/advent18/src/advent18direct.hs index 3d6125e..346e61f 100644 --- a/advent18/src/advent18direct.hs +++ b/advent18/src/advent18direct.hs @@ -23,7 +23,7 @@ type Keys = S.Set Char type PointOfInterest = M.Map Position Char -class (Eq e, Ord e, Show e) => ExplorerC e where +class (Eq e, Ord e, Show e) => Explorer e where successors :: e -> CaveContext (Q.Seq e) estimateCost :: e -> CaveContext Int -- positionE :: e -> Position @@ -52,7 +52,7 @@ data Agendum e = Agendum { _current :: e type Agenda e = P.MinPQueue Int (Agendum e) -- type Candidates e = S.Set (Int, Agendum e) -instance ExplorerC Explorer1 where +instance Explorer Explorer1 where successors explorer = do let here = _position1 explorer let locations0 = possibleNeighbours here @@ -84,7 +84,7 @@ instance ExplorerC Explorer1 where keysHeldE = _keysHeld1 emptyExplorer = Explorer1 { _position1 = (0, 0), _keysHeld1 = S.empty } -instance ExplorerC Explorer4 where +instance Explorer Explorer4 where successors explorer = do let rawHeres = _position4 explorer let heres = setToSeq $ allSplits rawHeres @@ -119,14 +119,14 @@ instance ExplorerC Explorer4 where main :: IO () main = do - text <- readFile "data/advent18x.txt" + text <- readFile "data/advent18.txt" let (cc, explorer) = buildCaveComplex text -- print cc -- print explorer print $ part1 cc explorer print $ part2 cc explorer -part1 :: ExplorerC e => CaveComplex -> e -> Int +part1 :: Explorer e => CaveComplex -> e -> Int part1 cave explorer = maybe 0 (( + 1) . _cost ) result where result = runReader (searchCave explorer) cave @@ -145,13 +145,13 @@ part2 caveComplex0 explorer1 = maybe 0 (( + 1) . _cost ) result explorer = Explorer4 {_position4 = [(re + 1, ce + 1), (re - 1, ce + 1), (re + 1, ce - 1), (re - 1, ce - 1)], _keysHeld4 = S.empty } result = runReader (searchCave explorer) caveComplex -keySeq :: ExplorerC e => (Agendum e) -> Q.Seq Keys +keySeq :: Explorer e => (Agendum e) -> Q.Seq Keys keySeq agendum = Q.filter (not . S.null) kdiff where keyss = fmap keysHeldE $ _trail agendum kdiff = fmap (uncurry S.difference) $ Q.zip ((keysHeldE $ _current agendum) <| keyss) keyss -searchCave :: ExplorerC e => e -> CaveContext (Maybe (Agendum e)) +searchCave :: Explorer e => e -> CaveContext (Maybe (Agendum e)) searchCave explorer = do agenda <- initAgenda explorer aStar agenda S.empty @@ -174,13 +174,13 @@ buildCaveCell r (cc, explorer) (c, char) here = (r, c) -initAgenda :: ExplorerC e => e -> CaveContext (Agenda e) +initAgenda :: Explorer e => e -> CaveContext (Agenda e) initAgenda explorer = do cost <- estimateCost explorer return $ P.singleton cost Agendum { _current = explorer, _trail = Q.empty, _cost = cost} -aStar :: ExplorerC e => Agenda e -> ExploredStates e -> CaveContext (Maybe (Agendum e)) +aStar :: Explorer e => Agenda e -> ExploredStates e -> CaveContext (Maybe (Agendum e)) -- aStar [] _ = Agendum {current=buildingTest, trail=[], cost=0} aStar agenda closed -- | trace ("Peeping " ++ (show $ fst $ P.findMin agenda) ++ ": " ++ (show reached) ++ " <- " ++ (show $ toList $ Q.take 1 $ _trail $ currentAgendum) ++ " :: " ++ (show newAgenda)) False = undefined @@ -200,13 +200,13 @@ aStar agenda closed else aStar newAgenda (S.insert reached closed) -isGoal :: ExplorerC e => e -> CaveContext Bool +isGoal :: Explorer e => e -> CaveContext Bool isGoal explorer = do keys <- asks (S.fromList . M.elems . _keys) return $ keys == keysHeldE explorer -candidates :: ExplorerC e => Agendum e -> ExploredStates e -> CaveContext (Q.Seq (Agendum e)) +candidates :: Explorer e => Agendum e -> ExploredStates e -> CaveContext (Q.Seq (Agendum e)) -- candidates a _ | trace ("Cand " ++ show (a)) False = undefined candidates agendum closed = do let candidate = _current agendum @@ -215,7 +215,7 @@ candidates agendum closed = let nonloops = Q.filter (\s -> not $ s `S.member` closed) succs mapM (makeAgendum candidate previous) nonloops -makeAgendum :: ExplorerC e => e -> (Q.Seq e) -> e -> CaveContext (Agendum e) +makeAgendum :: Explorer e => e -> (Q.Seq e) -> e -> CaveContext (Agendum e) -- makeAgendum c _p n | trace ("Agendum " ++ (show c) ++ " " ++ (show n) ) False = undefined makeAgendum candidate previous new = do cost <- estimateCost new