Advertisement
makispaiktis

Project Euler 11 - Largest product in a Grid

Jul 28th, 2020 (edited)
2,885
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.90 KB | None | 0 0
  1. '''
  2. In the 20×20 grid below, four numbers along a diagonal line have been marked in red.
  3.  
  4. 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  5. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  6. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  7. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  8. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  9. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  10. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  11. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  12. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  13. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  14. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  15. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  16. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  17. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  18. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  19. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  20. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  21. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  22. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  23. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
  24.  
  25. The product of these numbers is 26 × 63 × 78 × 14 = 1788696.
  26. What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?
  27. '''
  28. # FUNCTION 1
  29. def maxProductHorizontal(array, m):
  30.     product = 0
  31.     for i in range(n-m+1):
  32.         for j in range(n):
  33.             value = array[i][j] * array[i+1][j] * array[i+2][j] * array[i+3][j]
  34.             if value > product:
  35.                 product = value
  36.     return product
  37.  
  38. # FUNCTION 2
  39. def maxProductVertical(array, m):
  40.     product = 0
  41.     for i in range(n):
  42.         for j in range(n-m+1):
  43.             value = array[i][j] * array[i][j+1] * array[i][j+2] * array[i][j+3]
  44.             if value > product:
  45.                 product = value
  46.     return product
  47.  
  48. # FUNCTION 3
  49. def maxProductDiagRight(array, m):
  50.     product = 0
  51.     for i in range(n):
  52.         for diag in range(-(n-m), n-m+1):
  53.             j = i + diag
  54.             if i >= 0 and j >= 0 and i+3 < n and j+3 < n:
  55.                 value = array[i][j] * array[i+1][j+1] * array[i+2][j+2] * array[i+3][j+3]
  56.                 if value > product:
  57.                     product = value
  58.     return product
  59.  
  60. # FUNCTION 4
  61. def maxProductDiagLeft(array, m):
  62.     sum = n-1
  63.     product = 0
  64.     for i in range(n):
  65.         for diag in range(sum+1):
  66.             j = diag - i
  67.             if i >= 3 and j >= 0 and i < n and j+3 < n:
  68.                 value = array[i][j] * array[i-1][j+1] * array[i-2][j+2] * array[i-3][j+3]
  69.                 if value > product:
  70.                     product = value
  71.     return product
  72.  
  73.  
  74. n = 20
  75. m = 4
  76.  
  77. matrixWord = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 \
  78. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 \
  79. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 \
  80. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 \
  81. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 \
  82. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 \
  83. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 \
  84. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 \
  85. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 \
  86. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 \
  87. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 \
  88. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 \
  89. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 \
  90. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 \
  91. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 \
  92. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 \
  93. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 \
  94. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 \
  95. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 \
  96. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48"
  97.  
  98. matrixNumbers = matrixWord.split(" ")
  99. counter = -1
  100. array = [[0 for __ in range(n)] for _ in range(n)]
  101. for i in range(n):
  102.     for j in range(n):
  103.         counter += 1
  104.         array[i][j] = matrixNumbers[counter]
  105.  
  106. # Now, "array" is a 20x20 matrix with string numbers
  107. for i in range(n):
  108.     for j in range(n):
  109.         array[i][j] = int(array[i][j])
  110.  
  111. prodHoriz = maxProductHorizontal(array, m)
  112. print("**** 1. Horizontally ****")
  113. print(prodHoriz)
  114. print()
  115. prodVert = maxProductVertical(array, m)
  116. print("**** 2. Vertically ****")
  117. print(prodVert)
  118. print()
  119. prodDiagRight = maxProductDiagRight(array, m)
  120. print("**** 3. Diagonally Right ****")
  121. print(prodDiagRight)
  122. print()
  123. prodDiagLeft = maxProductDiagLeft(array, m)
  124. print("**** 4. Diagonally Left ****")
  125. print(prodDiagLeft)
  126. print()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement