X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent05%2FMain.hs;h=16e4f4cb270dfd5af3d03e0344d889e034d88e6a;hb=refs%2Fheads%2Fmain;hp=5dab7c10137b0ab821b956ab50a43d9c2e5571b0;hpb=1599e58ce29dd3ae6a2e0945d5f78c409295703a;p=advent-of-code-23.git diff --git a/advent05/Main.hs b/advent05/Main.hs index 5dab7c1..16e4f4c 100644 --- a/advent05/Main.hs +++ b/advent05/Main.hs @@ -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,17 +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 (min xl rl) (min xh (rl - 1)) -- input below rule - , Iv ((max xl rl) + d) ((min xh rh) + d)] -- input within rule - newVals = filter legalInterval [Iv (max xl (rh + 1)) (max xh rh)] -- input above rule - newRules = filter legalRule [Rule (Iv (max (xh + 1) rl) (max xh 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 @@ -83,7 +87,7 @@ expandRanges seeds = fmap expandRange ranges tidyIntervals :: [Interval] -> [Interval] -tidyIntervals ivs0 = tidyIntervalsS $ sort ivs0 +tidyIntervals = tidyIntervalsS . sort tidyIntervalsS :: [Interval] -> [Interval] tidyIntervalsS [] = [] @@ -121,10 +125,10 @@ seedsP = "seeds: " *> numbersP almanacP = M.fromList <$> (aMapP `sepBy` blankLineP) aMapP = aMapify <$> aMapHeaderP <*> rulesP -aMapHeaderP = (,) <$> (nameP <* "-to-") <*> (nameP <* " map:" <* endOfLine) +aMapHeaderP = (,) <$> nameP <* "-to-" <*> nameP <* " map:" <* endOfLine rulesP = ruleP `sepBy` endOfLine -ruleP = ruleify <$> (decimal <* space) <*> (decimal <* space) <*> decimal +ruleP = ruleify <$> decimal <* space <*> decimal <* space <*> decimal numbersP = decimal `sepBy` skipSpace nameP = many1 letter