Largest product in a grid

AUTHOR

Moritz Lenz

https://projecteuler.net/problem=11

In the 20Ɨ20 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 Ɨ 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?

use v6;



my @m =
    [<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>];

sub prod ($x is copy, $y is copy, $dx, $dy) {
    my $prod =  @m[$y][$x];
    for 1..3 {
        $x += $dx;
        $y += $dy;
        $prod *= @m[$y][$x];
    }
    return $prod;
}

my $max = 0;

# diagonals
for 0 .. 16 -> $x {
    for 0 .. 16 -> $y {
        $max = $max max prod($x, $y,     1, 1)
                    max prod($x, $y + 3, 1, -1);
    }
}

# horizontal
for 0..16 -> $x {
    for 0..19 -> $y {
        $max = $max max prod($x, $y, 1, 0);
    }
}

# vertical
for 0..19 -> $x {
    for 0..10 -> $y {
        $max = $max max prod($x, $y, 0, 1);
    }
}

say $max;

# vim: expandtab shiftwidth=4 ft=perl6

See Also

prob001-cspencer.pl

Multiples of 3 and 5

prob001-eric256.pl

Multiples of 3 and 5

prob001-grondilu.pl

Multiples of 3 and 5

prob001-hexmode.pl

Multiples of 3 and 5

prob001-unobe.pl

Multiples of 3 and 5

prob002-eric256.pl

Even Fibonacci numbers

prob002-gerdr.pl

Even Fibonacci numbers

prob002-hexmode.pl

Even Fibonacci numbers

prob003-eric256.pl

Largest prime factor

prob003-gerdr.pl

Largest prime factor

prob003-hexmode.pl

Largest prime factor

prob003-lanny.pl

Largest prime factor

prob004-unobe.pl

Largest palindrome product

prob004-xfix.pl

Largest palindrome product

prob005-unobe.pl

Smallest multiple

prob005-xfix.pl

Smallest multiple

prob006-polettix.pl

Sum square difference

prob007-polettix.pl

10001st prime

prob008-duff.pl

Largest product in a series

prob008-duff2.pl

Largest product in a series

prob009-gerdr-feeds.raku

Special Pythagorean triplet

prob009-gerdr.raku

Special Pythagorean triplet

prob009-polettix.pl

Special Pythagorean triplet

prob010-polettix.pl

Summation of primes

prob012-polettix.pl

Highly divisible triangular number

prob013-grondilu.pl

Large sum

prob014-felher.pl

Longest Collatz sequence

prob015-felher.pl

Lattice paths

prob016-grondilu.pl

Power digit sum

prob017-duff.pl

Number letter counts

prob018-felher.pl

Maximum path sum I

prob019-grondilu.pl

Counting Sundays

prob020-grondilu.pl

Factorial digit sum

prob021-gerdr.pl

Amicable numbers

prob022-grondilu.pl

Names scores

prob023-shlomif.pl

Non-abundant sums

prob024-moritz.pl

Lexicographic permutations

prob025-polettix.pl

1000-digit Fibonacci number

prob026-shlomif.pl

Reciprocal cycles

prob027-shlomif.pl

Quadratic primes

prob028-shlomif.pl

Number spiral diagonals

prob029-gerdr.pl

Distinct powers

prob029-polettix.pl

Distinct powers

prob031-shlomif.pl

Coin sums

prob033-andreoss.pl

Digit cancelling fractions

prob034-quinny.pl

Digit factorials

prob036-xenu.pl

Double-base palindromes

prob038-andreoss.pl

Pandigital multiples

prob039-quinny.pl

Integer right triangles

prob041-heyajulia-alternative.raku

Pandigital Prime

prob041-heyajulia.raku

Pandigital Prime

prob042-shlomif.p6

Coded triangle numbers

prob047-gerdr.pl

Distinct primes factors

prob052-duff.pl

Permuted multiples

prob053-duff.pl

Combinatoric selections

prob053-gerdr.pl

Combinatoric selections

prob054-andreoss.pl

Poker hands

prob055-shlomif.p6

Lychrel numbers

prob056-shlomif.p6

prob059-andreoss.pl

XOR decryption

prob063-moritz.pl

Powerful digit counts

prob063-polettix.pl

Powerful digit counts

prob065-andreoss.pl

Convergents of e

prob065-grondilu.pl

prob066-andreoss.pl

Diophantine equation

prob067-felher.pl

Maximum path sum II

prob080-andreoss.pl

Square root digital expansion

prob081-moritz.pl

Path sum: two ways

prob089-andreoss.pl

Roman numerals

prob092-moritz.pl

Square digit chains

prob097-andreoss.pl

Large non-Mersenne prime

prob098-andreoss.pl

Anagramic squares

prob099-andreoss.pl

Largest exponential

README.md

The Camelia image is copyright 2009 by Larry Wall. "Raku" is trademark of the Yet Another Society. All rights reserved.