Source

project-euler / project-euler / 18.pl

#!/usr/bin/perl 

use strict;
use warnings;

use List::Util qw(max);

my $triangle_str = <<'EOF';
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
EOF

my @lines = (map { [split(/\s+/, $_)] } split(/\n/, $triangle_str));

my @totals_lines = ([ @{$lines[0]} ]);

for my $i (1 .. $#lines)
{
    my $last = $totals_lines[-1];
    my $this = $lines[$i];
    push @totals_lines,
        [
            map
            { 
                $this->[$_] +
                max(
                  (($_ > 0) ? ($last->[$_-1]) : ()),
                  (($_ < $#{$this}) ? ($last->[$_]) : ())
                )
            } (0 .. $#{$this})
        ];
}

printf "Max is %i\n", max(@{$totals_lines[-1]});