In the 20x20 grid below, four numbers along a diagonal line have been marked in bold.
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 48
The product of these numbers is 26 x 63 x 78 x 14 = 1788696.
What is the greatest product of four adjacent numbers in any direction (up, down, left, right, or diagonally) in the 20x20 grid?
Possible Solution:
' Project Euler, Problem 11 Solution
' By Jason T. Jacques <jtjacques@gmail.com>
' Quickly generate grid
numbers = "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 48 "
For n = 1 To 20 ' row
For m = 1 To 20 ' column
grid[n][m] = Text.GetSubText(numbers, 1, Text.GetIndexOf(numbers, " ") - 1)
numbers = Text.GetSubTextToEnd(numbers, Text.GetIndexOf(numbers, " ") + 1)
EndFor
EndFor
Sub checkGrid
For n = 1 To 20
For m = 1 To 20
r = grid[n + (modN * 0)][m + (modM * 0)] * grid[n + (modN * 1)][m + (modM * 1)] * grid[n + (modN * 2)][m + (modM * 2)] * grid[n + (modN * 3)][m + (modM * 3)]
If (r > max) Then
max = r
' (optional) the start position and offset of the numbers used in this product
' - used to highlight the numbers in the grid
maxN = n
maxM = m
maxModN = modN
maxModM = modM
EndIf
EndFor
EndFor
EndSub
' Check rows
' - multiply with the number to the right (along one, down none), repeat twice more
modN = 0
modM = 1
checkGrid()
' Check columns
' - multiply with the number below (down one, along none), repeat twice more
modN = 1
modM = 0
checkGrid()
' Check diagonal top-left to bottom-right (\)
' - multiply with the number to the right and down (right one, down one), repeat twice more
modN = 1
modM = 1
checkGrid()
' Check diagonal top-right to bottom-left (/)
' - multiply with the numer down and to the left (down one, left (back) one), repeat twice more
modN = 1
modM = -1
checkGrid()
' (optional) Display grid showing highlighed numbers
For n = 1 To 20
For m = 1 To 20
If((n = maxN And m = maxM) Or (n = maxN + (maxModN * 1) And m = maxM + (maxModM * 1)) Or (n = maxN + (maxModN * 2) And m = maxM + (maxModM * 2)) Or (n = maxN + (maxModN * 3) And m = maxM + (maxModM * 3))) Then
TextWindow.ForegroundColor = "red"
Else
TextWindow.ForegroundColor = "white
EndIf
TextWindow.Write(grid[n][m] + " ")
EndFor
TextWindow.WriteLine("")
EndFor
TextWindow.WriteLine("")
TextWindow.WriteLine("Product: " + max)
Link:
http://smallbasic.com/program/?BRX346Import code:
BRX346