source: https://www.hackerrank.com/challenges/30-2d-arrays
module Main where
make2DIndex2 :: Int -> Int -> Int -> Int -> Int -> Int -> [(Int, Int)]
make2DIndex2 i j m' n' m n | i + m' <= m && j + n' <= n = [(x, y) | x <- [i..(i+m')], y <- [j..(j+n')]]
| otherwise = []
makeIndex :: Int -> Int -> Int -> Int -> [[Int]]
makeIndex m' n' m n = fmap (fmap (\(x,y) -> x * (n+1) + y)) (make2DIndex 0 0 m' n' m n)
make2DIndex :: Int -> Int -> Int -> Int -> Int -> Int -> [[(Int, Int)]]
make2DIndex i j m' n' m n | i + m' <= m && j + n' <= n = (make2DIndex2 i j m' n' m n) : (make2DIndex i (j+1) m' n' m n)
| j + n' > n = make2DIndex (i+1) 0 m' n' m n
| otherwise = []
takeArr :: [Int] -> [[Int]] -> [[Int]]
takeArr arr indexs = fmap (fmap ((!!) arr)) indexs
main :: IO()
main = do
arr <- fmap ((fmap read).words) getContents :: IO [Int]
print $ maximum (fmap (\xs -> sum xs - (xs !! 3) - (xs !! 5)) (takeArr arr (makeIndex 2 2 5 5)))
return ()