Problem 11: Largest Product in a Grid
Problem
In the grid 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 48
The product of these numbers is .
What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the grid?
Solution
See it on GitHub.
//* Problem 11: Largest Product in a Grid
//* In the 20 × 20 grid 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 48
//* the product of these numbers is 26 × 63 × 78 × 14 = 1788696.
//* What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20 × 20 grid?
//! time complexity: O(n^2)
//! where n is the size of the grid
use euler::prelude::*;
fn product<F>(selector: F) -> usize
where
F: FnMut(usize) -> usize,
{
(0..ADJACENT).map(selector).product()
}
fn solve() -> Solution {
let mut max = 0usize;
for row in 0..SIZE {
for col in 0..SIZE {
// right
if col + ADJACENT <= SIZE {
max = max.max(product(|i| GRID[row][col + i]));
}
// down
if row + ADJACENT <= SIZE {
max = max.max(product(|i| GRID[row + i][col]));
}
// diagonal down-right
if row + ADJACENT <= SIZE && col + ADJACENT <= SIZE {
max = max.max(product(|i| GRID[row + i][col + i]))
}
// diagonal down-left
if row + ADJACENT <= SIZE && col >= ADJACENT - 1 {
max = max.max(product(|i| GRID[row + i][col - i]))
}
}
}
solution!(max)
}
const SIZE: usize = 20;
const ADJACENT: usize = 4;
#[rustfmt::skip]
const GRID: [[usize; SIZE]; SIZE] = [
[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],
];
problem!(
11,
solve,
"9ded5bc849d33e477aa9c944138d34f0aacc485a372e84464e8a572712a5b7da"
);