From 8031b0327a6d4485d638cc032df621417f07da0c Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Mon, 13 Dec 2021 01:11:17 +0100 Subject: [PATCH] rewrite to not keep track of path --- 2021/day12.hs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/2021/day12.hs b/2021/day12.hs index 302f2f4..dd0984a 100644 --- a/2021/day12.hs +++ b/2021/day12.hs @@ -4,8 +4,10 @@ import Data.Map ( Map, fromList, unionWith, empty, (!) ) import Data.List.Split (splitOn) import qualified Data.Char -type Path = (String,String) -type System = Map String [String] +type Cave = String +type Path = (Cave,Cave) +type System = Map Cave [Cave] + readPath :: String -> Path readPath s = (from,to) where [from,to] = splitOn "-" s @@ -13,19 +15,17 @@ readPath s = (from,to) where [from,to] = splitOn "-" s addPath :: Path -> System -> System addPath (from,to) = unionWith (++) (Data.Map.fromList [(from,[to]), (to,[from])]) -isUpper :: String -> Bool +isUpper :: Cave -> Bool isUpper = Data.Char.isUpper . head -pathFinder :: System -> [String] -> HashSet String -> Int -pathFinder _ [] _ = error "no starting point!" -pathFinder sys p@("end":xs) _ = 1 -pathFinder sys p@(x:xs) visited = sum $ map (\next -> pathFinder sys (next:p) (next `insert` visited)) elig +pathFinder :: System -> Cave -> HashSet Cave -> Int +pathFinder sys "end" _ = 1 +pathFinder sys x visited = sum $ map (\next -> pathFinder sys next (next `insert` visited)) elig where elig = filter (\cave -> isUpper cave || not (cave `member` visited)) (sys ! x) -pathFinder2 :: System -> [String] -> HashSet String -> Int -pathFinder2 _ [] _ = error "no starting point!" -pathFinder2 sys p@("end":xs) _ = 1 -pathFinder2 sys p@(x:xs) visited = sum $ map (\next -> f next sys (next:p) (next `insert` visited)) elig +pathFinder2 :: System -> Cave -> HashSet Cave -> Int +pathFinder2 sys "end" _ = 1 +pathFinder2 sys x visited = sum $ map (\next -> f next sys next (next `insert` visited)) elig where f cave = if isUpper cave || not (cave `member` visited) then pathFinder2 else pathFinder elig = filter (/= "start") (sys ! x) @@ -36,7 +36,7 @@ main = do let system = foldr addPath Data.Map.empty input putStrLn "part 1: " - print $ pathFinder system ["start"] (Data.HashSet.fromList ["start"]) + print $ pathFinder system "start" (Data.HashSet.fromList ["start"]) putStrLn "part 2: " - print $ pathFinder2 system ["start"] (Data.HashSet.fromList ["start"]) + print $ pathFinder2 system "start" (Data.HashSet.fromList ["start"])