Life Goes On

まあまあだけど楽しんでる方です

82問目

http://projecteuler.net/index.php?section=problems&id=82
80 × 80 の行列を左辺から右辺まで、右か上か下に移動しながら辿るとき、各点の値の合計の最小値を求める。
行列をタテヨコ変換して、後は最小値を求めていくだけです。

import Data.List

main = do
    s <- readFile "matrix.txt"
    print $ euler082 $ matrix s

matrix :: String -> [[Int]]
matrix = map (read . (\ s -> "[" ++ s ++ "]")) . lines

euler082 :: [[Int]] -> Int
euler082 = minimum . foldl1 sumRow . transpose

sumRow :: [Int] -> [Int] -> [Int]
sumRow pre this = map (sumOne pre) $ zip (tail $ inits this) (tails this)

sumOne :: [Int] -> ([Int], [Int]) -> Int
sumOne pre (lower, upper) = minimum $ zipWith (+) pre $ map sum $
    (init $ tails $ lower) ++ (drop 2 $ inits $ upper)