Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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"
);