X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent11p.hs;h=cdcf0307ba2735c1dc04fcadb0a67ea086e1cd80;hb=1f63e23a5c72a2aa7589a002e54dbb75e7a033bb;hp=24955b90358d463d04653f3207e28a8f1db3c28d;hpb=e244d245682d465eb3784ac0ac2ba13342628810;p=advent-of-code-16.git diff --git a/advent11p.hs b/advent11p.hs index 24955b9..cdcf030 100644 --- a/advent11p.hs +++ b/advent11p.hs @@ -1,3 +1,9 @@ +-- Using the idea of canonical representation of buildings from +-- https://andars.github.io/aoc_day11.html by Andrew Foote, +-- plus my extension of represening the pairs as an integer. + +-- This version is A* search, using a priority queue for the agenda. + import Data.List (subsequences, (\\), sort, sortOn, nub, findIndices) import Data.Ord (comparing) import Data.Char (isDigit) @@ -7,7 +13,6 @@ import qualified Data.PQueue.Prio.Min as P data Item = Generator String | Microchip String deriving (Show, Eq) type Floor = [Item] data Building = Building Int [Floor] deriving (Show, Eq) --- data CBuilding = CBuilding Int [(Int, Int)] deriving (Show, Eq) data CBuilding = CBuilding Int Integer deriving (Show, Eq) data Agendum = Agendum {current :: Building, trail :: [CBuilding], cost :: Int} type Agenda = P.MinPQueue Int Agendum @@ -106,8 +111,6 @@ candidates agendum closed = newCandidates candidate = current agendum previous = trail agendum succs = legalSuccessors $ successors candidate - -- excludable = previous ++ closed - -- nonloops = filter (\s -> not $ (canonical s) `elem` excludable) succs nonloops = filter (\s -> not $ (canonical s) `elem` closed) succs newCandidates = map (\a -> (cost a, a)) $ map (\n -> makeAgendum n) nonloops makeAgendum new = Agendum {current = new,