diff --git a/src/projectEuler/question11.hs b/src/projectEuler/question11.hs index e5e4ace..85725e1 100644 --- a/src/projectEuler/question11.hs +++ b/src/projectEuler/question11.hs @@ -26,6 +26,7 @@ The product of these numbers is 26x63x78x14 = 1788696. What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20x20 grid? -} +import Data.List (genericDrop, genericIndex, genericTake) grid :: [[Integer]] grid = @@ -50,3 +51,60 @@ grid = , [20, 73, 35, 29, 78, 31, 90, 01, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 05, 54] , [01, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 01, 89, 19, 67, 48] ] + +points :: Integer -> [(Integer, Integer)] +points n = [ (x,y) | x <- [1..n], y <- [1..n] ] + +allDiagonals :: Integer -> [[(Integer, Integer)]] +allDiagonals n = + [ [(i, j), b, c, d] + | (i, j) <- points n + , i+3 <= n + , j+3 <= n + , b <- [(i + 1, j + 1)] + , c <- [(i + 2, j + 2)] + , d <- [(i + 3, j + 3)] + ] + +allUpDown :: Integer -> [[(Integer, Integer)]] +allUpDown n = + [ [(i, j), b, c, d] + | (i, j) <- points n + , i <= n + , j+3 <= n + , b <- [(i, j + 1)] + , c <- [(i, j + 2)] + , d <- [(i, j + 3)] + ] + +allLeftRight :: Integer -> [[(Integer, Integer)]] +allLeftRight n = + [ [(i, j), b, c, d] + | (i, j) <- points n + , i+3 <= n + , j <= n + , b <- [(i + 1, j)] + , c <- [(i + 2, j)] + , d <- [(i + 3, j)] + ] + +allSequences :: Integer -> [[(Integer, Integer)]] +allSequences n = allDiagonals n ++ allUpDown n ++ allLeftRight n + +s20x20 :: [[(Integer, Integer)]] +s20x20 = allSequences 20 + +getValue :: [[Integer]] -> (Integer, Integer) -> Integer +getValue grid (x,y) = row `genericIndex` y' + where row = (head . genericDrop (x-1) . genericTake x) grid + y' = y-1 -- compensate for 1 index numbering above + +-- | +-- λ> ans +-- 51267216 +-- (0.13 secs, 38,281,312 bytes) +ans :: Integer +ans = maximum $ map (product . map (getValue grid)) s20x20 + +main :: IO () +main = print ans