In the
20×20grid below, four numbers along a diagonal line have been marked in red.
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 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 03 45 02 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 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
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 48The product of these numbers is
26 × 63 × 78 × 14 = 1788696.What is the greatest product of four adjacent numbers in any direction (up, down, left, right, or diagonally) in the
20×20grid?
This particular task doesn't leave much space for imagination, and as zeros are included, it doesn't make sense to use previous products to speed it up a little bit. So, we'll keep it simple, with just one array of all the numbers (knowing the column count, we don't have to have each row as one array) we will iterate over the horizontals, verticals and in both diagonal ways. We already know the value of one of the non-zero products so we can use it as an initial value for our maximum. For the iterators, only additions would do (well, to keep it short, I'll use 2*colCount instead of colCount + colCount) and then we just multiply the four values. Easy this time.
Just for the fun of I've used fileStream this time, at least it keeps me from repeating the exact same code as the last time.
(fn getGrid filePath =(local row, lineNr = 1local result = #()local file = openFile filePathwhile NOT EOF file do(row = (filterString (readLine file) " ")join result (for i = 1 to row.count collect row[i] as integer)lineNr += 1)close fileresult)fn iterateOverGrid grid rowCount:20 colCount:20 =(local maxProduct = 1788696-- horizontalfor i = 0 to (rowCount - 1) do(local index = i*colCountlocal horMax = amax \(for j = 1 to (colCount - 3) collectgrid[index += 1]*grid[index+1]*grid[index+2]*grid[index+3])if horMax > maxProduct domaxProduct = horMax)-- verticalfor i = 1 to colCount do(local index = ilocal verMax = amax \(for j = 0 to (rowCount - 4) collectgrid[index]*grid[index += colCount]*grid[index+colCount]*grid[index+2*colCount])if verMax > maxProduct domaxProduct = verMax)-- diagonal 1for i = 0 to (rowCount - 4) do(local index = i*colCountlocal diff = colCount + 1local diagMax1 = amax \(for j = 1 to (colCount - 3) collectgrid[index += 1]*grid[index+diff]*grid[index+2*diff]*grid[index+3*diff])if diagMax1 > maxProduct domaxProduct = diagMax1)-- diagonal 2for i = 3 to (rowCount - 1) do(local index = i*colCountlocal diff = colCount - 1local diagMax2 = amax \(for j = 1 to (colCount - 3) collectgrid[index += 1]*grid[index-diff]*grid[index-2*diff]*grid[index-3*diff])if diagMax2 > maxProduct domaxProduct = diagMax2)maxProduct)testGrid = getGrid "Z:\Euler\prob11.txt"iterateOverGrid testGrid)
DISCLAIMER: All scripts and snippets are provided as is under Creative Commons Zero (public domain, no restrictions) license. The author and this blog cannot be held liable for any loss caused as a result of inaccuracy or error within these web pages. Use at your own risk.


This Post needs Your Comment!
Leave a Comment