24 lines
638 B
Haskell
24 lines
638 B
Haskell
|
import Data.List.Split
|
||
|
import Data.List
|
||
|
|
||
|
toMapFn :: [[Int]] -> Int -> Int
|
||
|
toMapFn map seed
|
||
|
| Just [d,s, r] <- find (\[drs, srs, r] -> (srs <= seed) && (seed <= srs + r)) map = d + (seed - s)
|
||
|
| otherwise = seed
|
||
|
|
||
|
main :: IO ()
|
||
|
main = do
|
||
|
lines <- lines <$> getContents
|
||
|
|
||
|
let sections = splitOn [""] lines
|
||
|
let seeds = map read $ tail $ splitOn [' '] (sections!!0!!0) :: [Int]
|
||
|
|
||
|
let maps = map (\(_:xs) -> (map (\l -> map (\i -> (read i) :: Int) (splitOn [' '] l)) xs)) (tail sections)
|
||
|
let myMapFns = map (toMapFn) maps
|
||
|
let myFn = foldr (.) id (reverse myMapFns)
|
||
|
|
||
|
print (minimum (map myFn seeds))
|
||
|
|
||
|
-- mapM_ putStrLn lines
|
||
|
|