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)