Maximum path sum I

AUTHOR

Felix Herrmann

https://projecteuler.net/problem=18

By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.

    3
    7 4
    2 4 6
    8 5 9 3

That is, 3 + 7 + 4 + 9 = 23.

Find the maximum total from top to bottom of the triangle below:

75
    95 64
    17 47 82
    18 35 87 10
    20 04 82 47 65
    19 01 23 75 03 34
    88 02 77 73 07 63 67
    99 65 04 28 06 16 70 92
    41 41 26 56 83 40 80 70 33
    41 48 72 33 47 32 37 16 94 29
    53 71 44 65 25 43 91 52 97 51 14
    70 11 33 28 77 73 17 78 39 68 17 57
    91 71 52 38 17 14 91 43 58 50 27 29 48
    63 66 04 68 89 53 67 30 73 16 69 87 40 31
    04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o)

use v6;



my $triangle =
    '75
    95 64
    17 47 82
    18 35 87 10
    20 04 82 47 65
    19 01 23 75 03 34
    88 02 77 73 07 63 67
    99 65 04 28 06 16 70 92
    41 41 26 56 83 40 80 70 33
    41 48 72 33 47 32 37 16 94 29
    53 71 44 65 25 43 91 52 97 51 14
    70 11 33 28 77 73 17 78 39 68 17 57
    91 71 52 38 17 14 91 43 58 50 27 29 48
    63 66 04 68 89 53 67 30 73 16 69 87 40 31
    04 62 98 27 23 09 70 98 73 93 38 53 60 04 23';

my @lines = string-to-array($triangle).reverse;

# reduce the triangle by adding up the lines until only one line with one
# element is left; then print it.
say "{@lines.reduce: &add-maxima}";

# this function assumes the shorter and longer array to be consecutive lines
# in an reversed triangle. It then adds each of the maxima of consecutive fields
# of the longer array to their shared diagonal neighbour in the shorter array.
sub add-maxima(@longer, @shorter is copy) {
    for 0 .. @longer - 2 -> $i {
        @shorter[$i] += max @longer[$i], @longer[$i + 1];
    }
    return @shorter;
}

sub string-to-array($string) {
    my @lines = $string.lines;
    @lines .= map(-> $line { $line.comb(/\d+/).item });
}

# 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

prob011-moritz.pl

Largest product in a grid

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

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.