Guest User

Untitled

a guest
Mar 7th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.86 KB | None | 0 0
  1. module Main where
  2.  
  3. import Data.Array (Array, (!), bounds, listArray)
  4. import Data.Ix (Ix, inRange, range)
  5.  
  6.  
  7.  
  8. readArray :: (Ix i, Read e) => (i, i) -> String -> Array i e
  9. readArray bds = listArray bds . map read . words
  10.  
  11.  
  12. walkArray :: (Ix i) => Int -> i -> (i -> i) -> Array i e -> [e]
  13. walkArray n i step a = [a ! i' | i' <- take n . iterate step $ i,
  14. bounds a `inRange` i']
  15.  
  16.  
  17. plus :: (Integral a) => (a, a) -> (a, a) -> (a, a)
  18. (a1, b1) `plus` (a2, b2) = (a1 + a2, b1 + b2)
  19.  
  20.  
  21. p11 :: String -> Int
  22. p11 = maximum . map product . sequences . readArray ((0, 0), (19, 19))
  23. where
  24. dirs = [(0, 1), (1, 0), (1, 1), (1, -1)]
  25. sequences a = [walkArray 4 i f a | i <- range . bounds $ a,
  26. f <- map plus dirs]
  27.  
  28.  
  29. main :: IO ()
  30. main = do
  31. txt <- readFile "Data/p11.txt"
  32. print . p11 $ txt
Add Comment
Please, Sign In to add comment