use strict; use warnings; use 5.014; use Term::ANSIColor qw{ :constants }; open my $inFH, q{<}, \ < ) { chomp; push @lines, [ map { { val => $_, sum => undef } } split ]; } close $inFH or die $!; if ( scalar @lines == 1 ) { say qq{Minimum path sum is - $lines[ 0 ]->[ 0 ]->{ val }}; say q{ No path}; } elsif ( scalar @lines == 2 ) { my $compIdx = $lines[ 1 ]->[ 1 ]->{ val } <=> $lines[ 1 ]->[ 0 ]->{ val }; say qq{Minimum path sum is - }, $lines[ 0 ]->[ 0 ]->{ val } + $lines[ 1 ]->[ $idxLR[ $compIdx ] ]->{ val }; say qq{ Path is - $pathLR[ $compIdx ]}; } else { do { $_->{ sum } = $_->{ val }; $_->{ path } = []; } for @{ $lines[ -1 ] }; foreach my $lineIdx ( reverse 0 .. $#lines - 1 ) { my $raLine = $lines[ $lineIdx ]; foreach my $itemIdx ( 0 .. $#{ $raLine } ) { my $compIdx = $lines[ $lineIdx + 1 ]->[ $itemIdx + 1 ]->{ sum } <=> $lines[ $lineIdx + 1 ]->[ $itemIdx ]->{ sum }; $raLine->[ $itemIdx ]->{ sum } = $raLine->[ $itemIdx ]->{ val } + $lines[ $lineIdx + 1 ] ->[ $itemIdx + $idxLR[ $compIdx ] ] ->{ sum }; $raLine->[ $itemIdx ]->{ path } = [ $pathLR[ $compIdx ], @{ $lines[ $lineIdx + 1 ] ->[ $itemIdx + $idxLR[ $compIdx ] ] ->{ path } } ]; } } my @pathElems = ( 0 ); push @pathElems, m{L} ? $pathElems[ -1 ] : $pathElems[ -1 ] + 1 for @{ $lines[ 0 ]->[ 0 ]->{ path } };; say qq{Minimum path sum is - $lines[ 0 ]->[ 0 ]->{ sum }}; say q{ Path is - T-}, join q{-}, @{ $lines[ 0 ]->[ 0 ]->{ path } }; say q{ Elements are - }, join q{-}, @pathElems; say q{}; my $nElems = scalar( @lines ) * 2 - 1; my $fmt = q{%2s} x $nElems; $fmt .= qq{\n}; for my $lineIdx ( 0 .. $#lines ) { printf $fmt, ( q{ } ) x ( $#lines - $lineIdx ), sub { my @arr = map { $_ == $pathElems[ $lineIdx ] ? RED . $_[ $_ ] . RESET : $_[ $_ ] } 0 .. $#_; splice @arr, $_, 0, q{ } for reverse 1 .. $#arr; return @arr; }->( map { $_->{ val } } @{ $lines[ $lineIdx ] } ), ( q{ } ) x ( $#lines - $lineIdx ); } } #### Minimum path sum is - 8 Path is - T-L-R-L Elements are - 0-0-1-1 01 02 04 06 04 09 05 01 07 02