11問目
http://projecteuler.net/index.php?section=problems&id=11
20×20に並んだ数字の中から、縦、横、斜めいずれか一直線に並んだ4つの数字を選び、積が最大となるものを求める。
2次元のリストに格納して、後はとにかく調べます。(ずいぶん適当だったので修正しました)
main = do grid <- readFile "euler011.txt" print $ euler011 $ prepare grid prepare :: String -> [[Int]] prepare = map (map read . words) . lines euler011 :: [[Int]] -> Int euler011 grid = maximum [product' grid (x, y) (dx, dy) | x <- [0..19], y <- [0..19], (dx, dy) <- [(1, 0), (1, 1), (0, 1), (-1, 1)]] product' :: [[Int]] -> (Int, Int) -> (Int, Int) -> Int product' grid (x, y) (dx, dy) | (x+dx*3 >= 20) || (x+dx*3 < 0) || (y+dy*3 >= 20) || (y+dy*3 < 0) = 0 | otherwise = (grid !! y !! x) * (grid !! (y+dy*1) !! (x+dx*1)) * (grid !! (y+dy*2) !! (x+dx*2)) * (grid !! (y+dy*3) !! (x+dx*3))