Project Euler - Problem 11

Question

In the 20 x 20 grid below, four numbers along a diagonal line have been marked in red (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 20 x 20 grid?

Solution

$data[] = explode(' ', '08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08');
$data[] = explode(' ', '49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00');
$data[] = explode(' ', '81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65');
$data[] = explode(' ', '52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91');
$data[] = explode(' ', '22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80');
$data[] = explode(' ', '24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50');
$data[] = explode(' ', '32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70');
$data[] = explode(' ', '67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21');
$data[] = explode(' ', '24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72');
$data[] = explode(' ', '21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95');
$data[] = explode(' ', '78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92');
$data[] = explode(' ', '16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57');
$data[] = explode(' ', '86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58');
$data[] = explode(' ', '19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40');
$data[] = explode(' ', '04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66');
$data[] = explode(' ', '88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69');
$data[] = explode(' ', '04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36');
$data[] = explode(' ', '20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16');
$data[] = explode(' ', '20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54');
$data[] = explode(' ', '01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48');
$greatest = $_product = 0;
for ($y = 0; $y < count($data); $y++) {
  for ($x = 0; $x < count($data[$y]); $x++) {
    // Store horizontal numbers based on X position (backwards and forward).
    $_num[0] = array($data[$y][$x]);
    if (!isset($data[$y][$x + 1])) { $_num[0][] = 0; } else { $_num[0][] = $data[$y][$x + 1]; }
    if (!isset($data[$y][$x + 2])) { $_num[0][] = 0; } else { $_num[0][] = $data[$y][$x + 2]; }
    if (!isset($data[$y][$x + 3])) { $_num[0][] = 0; } else { $_num[0][] = $data[$y][$x + 3]; }
    $_num[1] = array($data[$y][$x]);
    if (!isset($data[$y][$x - 1])) { $_num[1][] = 0; } else { $_num[1][] = $data[$y][$x - 1]; }
    if (!isset($data[$y][$x - 2])) { $_num[1][] = 0; } else { $_num[1][] = $data[$y][$x - 2]; }
    if (!isset($data[$y][$x - 3])) { $_num[1][] = 0; } else { $_num[1][] = $data[$y][$x - 3]; }
    // Vertical numbers from X point.
    $_num[2] = array($data[$y][$x]);
    if (!isset($data[$y + 1][$x])) { $_num[2][] = 0; } else { $_num[2][] = $data[$y + 1][$x]; }
    if (!isset($data[$y + 2][$x])) { $_num[2][] = 0; } else { $_num[2][] = $data[$y + 2][$x]; }
    if (!isset($data[$y + 3][$x])) { $_num[2][] = 0; } else { $_num[2][] = $data[$y + 3][$x]; }
    $_num[3] = array($data[$y][$x]);
    if (!isset($data[$y - 1][$x])) { $_num[3][] = 0; } else { $_num[3][] = $data[$y - 1][$x]; }
    if (!isset($data[$y - 2][$x])) { $_num[3][] = 0; } else { $_num[3][] = $data[$y - 2][$x]; }
    if (!isset($data[$y - 3][$x])) { $_num[3][] = 0; } else { $_num[3][] = $data[$y - 3][$x]; }
    // Diagonal position (top left to down right).
    $_num[4] = array($data[$y][$x]);
    if (!isset($data[$y + 1][$x + 1])) { $_num[4][] = 0; } else { $_num[4][] = $data[$y + 1][$x + 1]; }
    if (!isset($data[$y + 2][$x + 2])) { $_num[4][] = 0; } else { $_num[4][] = $data[$y + 2][$x + 2]; }
    if (!isset($data[$y + 3][$x + 3])) { $_num[4][] = 0; } else { $_num[4][] = $data[$y + 3][$x + 3]; }
    $_num[5] = array($data[$y][$x]);
    if (!isset($data[$y - 1][$x - 1])) { $_num[5][] = 0; } else { $_num[5][] = $data[$y - 1][$x - 1]; }
    if (!isset($data[$y - 2][$x - 2])) { $_num[5][] = 0; } else { $_num[5][] = $data[$y - 2][$x - 2]; }
    if (!isset($data[$y - 3][$x - 3])) { $_num[5][] = 0; } else { $_num[5][] = $data[$y - 3][$x - 3]; }
    // Diagonal position (top right to down left).
    $_num[6] = array($data[$y][$x]);
    if (!isset($data[$y + 1][$x - 1])) { $_num[6][] = 0; } else { $_num[6][] = $data[$y + 1][$x - 1]; }
    if (!isset($data[$y + 2][$x - 2])) { $_num[6][] = 0; } else { $_num[6][] = $data[$y + 2][$x - 2]; }
    if (!isset($data[$y + 3][$x - 3])) { $_num[6][] = 0; } else { $_num[6][] = $data[$y + 3][$x - 3]; }
    $_num[7] = array($data[$y][$x]);
    if (!isset($data[$y - 1][$x + 1])) { $_num[7][] = 0; } else { $_num[7][] = $data[$y - 1][$x + 1]; }
    if (!isset($data[$y - 2][$x + 2])) { $_num[7][] = 0; } else { $_num[7][] = $data[$y - 2][$x + 2]; }
    if (!isset($data[$y - 3][$x + 3])) { $_num[7][] = 0; } else { $_num[7][] = $data[$y - 3][$x + 3]; }

    foreach ($_num as $__num) {
      $_product = $__num[0] * $__num[1] * $__num[2] * $__num[3];
      if ($_product > $greatest) {
        $greatest = $_product;
      }
    }
  }
}
echo $greatest;

Time taken to execute: 0.0143 second.

Answer

70600674

2 comments for 'Project Euler - Problem 11'

I adore your blog post.. comfortable colours & motif. Does a person design and style this amazing site on your own or maybe do anyone bring in help to make it work in your case Plz react seeing that I!m aiming to style my personal website and would want to find out exactly where ough obtained this kind of from. thank you
linux

Thanks for your comment, this blog was designed by me myself. I love the idea of having simplicity and vibrant colours all around :-)

Add new comment