25 lines
704 B
Haskell
25 lines
704 B
Haskell
import Data.List.Split
|
|
import Data.List
|
|
|
|
toMapFn :: [(Int, Int)] -> Int -> Int
|
|
toMapFn map seed
|
|
| Just (d,s) <- find (\(drs, srs) -> srs == seed) map = d
|
|
| 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 myMaps = map (\m -> concat (map (\[drs, srs, r] -> zip [drs..(drs+r)] [srs..(srs+r)]) m)) maps
|
|
let myMapFns = map (toMapFn) myMaps
|
|
let myFn = foldr (.) id (reverse myMapFns)
|
|
|
|
print (minimum (map myFn seeds))
|
|
|
|
-- mapM_ putStrLn lines
|
|
|