Day 5
This commit is contained in:
33
day05/Part2.hs
Normal file
33
day05/Part2.hs
Normal file
@@ -0,0 +1,33 @@
|
||||
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
|
||||
Reference in New Issue
Block a user