Files
advent-of-code-2023/day05/Part2.hs
2023-12-05 10:48:55 +01:00

34 lines
1.4 KiB
Haskell

module Part2 where
import Commons
applyConversionMap :: ConversionMap -> Int -> Int -> [Int]
applyConversionMap [] v vs = [v, vs]
applyConversionMap _ _ 0 = []
applyConversionMap (e: t) v vs
| v >= sourceStart e && v <= sourceStart e + size e =
let newVs = min (sourceStart e + size e) (v + vs) - v
in (destinationStart e - sourceStart e + v): newVs: applyConversionMap t (v + newVs) (vs - newVs)
| v < sourceStart e && v + vs >= sourceStart e =
let newVs = v + vs - sourceStart e
in applyConversionMap (e: t) (sourceStart e) newVs ++ applyConversionMap t v (vs - newVs)
| otherwise = applyConversionMap t v vs
applyConversionMapToList :: ConversionMap -> [Int] -> [Int]
applyConversionMapToList cm [] = []
applyConversionMapToList cm (v: vs: t) = applyConversionMap cm v vs ++ applyConversionMapToList cm t
getLocations :: Almanac -> [Int]
getLocations a = applyConversionMapToList (toLocation a) . applyConversionMapToList (toHumidity a)
. applyConversionMapToList (toTemperature a) . applyConversionMapToList (toLight a)
. applyConversionMapToList (toWater a) . applyConversionMapToList (toFertilizer a)
. applyConversionMapToList (toSoil a) $ seeds a
dropLocationsSizes :: [Int] -> [Int]
dropLocationsSizes [] = []
dropLocationsSizes (start: size: t) = start: dropLocationsSizes t
getLocationsStarts :: Almanac -> [Int]
getLocationsStarts = dropLocationsSizes . getLocations