34 lines
1.4 KiB
Haskell
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
|