Done part 2
[advent-of-code-23.git] / advent05 / Main.hs
index a01860c8d67e8fa2899637e371a6227e05d7727f..d8bb80651619e20b6408db47ece5cfb9e999f897 100644 (file)
@@ -39,7 +39,7 @@ lowestLocation almanac seeds = l
         (Iv l _) = head locations
 
 followRequirements :: Almanac -> Requirement -> Requirement
-followRequirements _ req@(Requirement "location" vals) = req
+followRequirements _ req@(Requirement "location" _) = req
 followRequirements almanac (Requirement name vals) = 
   followRequirements almanac newReq
   where aMap = almanac ! name
@@ -49,18 +49,21 @@ followRequirements almanac (Requirement name vals) =
 useRule :: Rule -> Interval -> ([Interval], [Interval], [Rule])
 useRule (Rule (Iv rl rh) d) (Iv xl xh) = (newResults, newVals, newRules)
   where newResults = 
-           filter legalInterval [ Iv xl (rl - 1) -- input below rule
-                               , Iv ((max xl rl) + d) ((min xh rh) + d)] -- input within rule
-        newVals = filter legalInterval [Iv (rh + 1) xh] -- input above rule
-        newRules = filter legalRule [Rule (Iv (xh + 1) rh) d] -- rule above input
+           filter legalInterval 
+            [ Iv xl (rl - 1) -- input below rule
+            , Iv ((max xl rl) + d) ((min xh rh) + d)] -- input within rule
+        newVals = filter legalInterval 
+            [Iv (rh + 1) xh] -- input above rule
+        newRules = filter legalRule 
+            [Rule (Iv (xh + 1) rh) d] -- rule above input
 
 
 useRules :: [Rule] -> [Interval] -> [Interval]
 useRules [] vals = vals
 useRules _ [] = []
-useRules (r@(Rule (Iv rl rh) _):rs) (v@(Iv xl xh):vs)  
-  | rh < xl = useRules rs (v:vs)
-  | xh < rl = v : useRules (r:rs) vs
+useRules (r@(Rule rv _):rs) (v:vs)  
+  | rv `allBelow` v = useRules rs (v:vs)
+  | v `allBelow` rv = v : useRules (r:rs) vs
   | otherwise = newResults ++ (useRules (newRules ++ rs) (newVals ++ vs))
   where (newResults, newVals, newRules) = useRule r v
 
@@ -84,7 +87,7 @@ expandRanges seeds = fmap expandRange ranges
 
 
 tidyIntervals :: [Interval] -> [Interval]
-tidyIntervals ivs0 = tidyIntervalsS $ sort ivs0
+tidyIntervals = tidyIntervalsS . sort
 
 tidyIntervalsS :: [Interval] -> [Interval]
 tidyIntervalsS [] = []