Michael Mafeni
Michael Mafeni

Reputation: 5

Can't find error in code (Project Euler #11 (Haskell))

I can't seem to find out why my code isn't working. I think I'm correct and all the examples I've seen do the same thing I do. But when I execute it, I get a different answer. Could someone please help me in finding out what's wrong? (adj4 is my final answer)

type Grid = [[Integer]]

twentyGrid :: [Integer]
twentyGrid = [8,2,22,97,38,15,0,40,0,75,4,5,7,78,52,12,50,77,91,8,49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48,4,56,62,0,81,49,31,73,55,79,14,29,93,71,40,67,53,88,30,3,49,13,36,65,52,70,95,23,4,60,11,42,69,24,68,56,1,32,56,71,37,2,36,91,22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80,24,47,32,60,99,3,45,2,44,75,33,53,78,36,84,20,35,17,12,50,32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70,67,26,20,68,2,62,12,20,95,63,94,39,63,8,40,91,66,49,94,21,24,55,58,5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72,21,36,23,9,75,0,76,44,20,45,35,14,0,61,33,97,34,31,33,95,78,17,53,28,22,75,31,67,15,94,3,80,4,62,16,14,9,53,56,92,16,39,5,42,96,35,31,47,55,58,88,24,0,17,54,24,36,29,85,57,86,56,0,48,35,71,89,7,5,44,44,37,44,60,21,58,51,54,17,58,19,80,81,68,5,94,47,69,28,73,92,13,86,52,17,77,4,89,55,40,4,52,8,83,97,35,99,16,7,97,57,32,16,26,26,79,33,27,98,66,88,36,68,87,57,62,20,72,3,46,33,67,46,55,12,32,63,93,53,69,4,42,16,73,38,25,39,11,24,94,72,18,8,46,29,32,40,62,76,36,20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74,4,36,16,20,73,35,29,78,31,90,1,74,31,49,71,48,86,81,16,23,57,5,54,1,70,54,71,83,51,54,69,16,92,33,48,61,43,52,1,89,19,67,48]



rows :: Int -> [Integer] -> Grid --split grid into rows of length n
rows n [] = []
rows n xs = (take n xs):(rows n (drop n xs))

cols :: Int -> [Integer] -> Grid
cols n  = (transpose.rows n)

rowGrid :: Grid
rowGrid = rows 20 twentyGrid

colGrid :: Grid
colGrid = cols 20 twentyGrid

getDiag ::  Grid-> [Integer] --get a diagonal
getDiag [] = []
getDiag xss
    | head xss == [] = []
    | otherwise  = ((head.head) xss) : (getDiag ((map(drop 1).(drop 1)) xss))

adjac :: Int -> [Integer] -> [[Integer]] -- get all possible combinations of n numbers
adjac 0 xs = []
adjac n [] = []
adjac n (x:xs)
    | length (x:xs) > n = (take n (x:xs)) : (adjac n xs)
    | otherwise          = [x:xs]

diags :: Grid -> Grid
diags [] = []
diags (xs:xss)
    | (xs == []) = []
    | otherwise   =(getDiag (xs:xss)): (diags (map (drop 1) (xs:xss)))

upDiag :: Grid --get upper diaonals
upDiag = diags rowGrid

lowDiag :: Grid -- get lower diagonals
lowDiag = diags colGrid

allCells :: Grid --every diagonal column and row merged together
allCells = rowGrid ++ colGrid ++ upDiag ++ lowDiag

adj4 :: Integer --find largest product of 4 adjacent numbers
adj4 = (maximum.map maximum.map (map product).map (adjac 4)) allCells

testAdj :: [[Integer]]
testAdj = (map (map product).map (adjac 4)) allCells

Upvotes: 0

Views: 95

Answers (1)

K. A. Buhr
K. A. Buhr

Reputation: 50929

It looks like you are handling the diagonals that go from upper left to lower right, both above the main diagonal (upDiag) and below the main diagnoal (lowDiag). However, you don't seem to be handling diagonals in the other direction. For example, if you look in the top-left corner of the grid:

08 02 22 97
49 49 99 40 ...
81 49 31 73
52 70 95 23
...

you have no code checking diagonals like the bolded one.

Upvotes: 2

Related Questions