Life Goes On

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

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))