diff options
| author | Lance Wicks <lw@judocoach.com> | 2021-02-20 13:43:13 +0000 |
|---|---|---|
| committer | Lance Wicks <lw@judocoach.com> | 2021-02-20 13:43:13 +0000 |
| commit | d3823be9dcc5ba8cfc243dcf0ab04e8d374b7b77 (patch) | |
| tree | ddedf4ebc36dbb5563e2eb8e10d0d700eea00116 | |
| parent | 6c7941137c37771eecd7e449bce54ab9bbbbd7ff (diff) | |
| download | perlweeklychallenge-club-d3823be9dcc5ba8cfc243dcf0ab04e8d374b7b77.tar.gz perlweeklychallenge-club-d3823be9dcc5ba8cfc243dcf0ab04e8d374b7b77.tar.bz2 perlweeklychallenge-club-d3823be9dcc5ba8cfc243dcf0ab04e8d374b7b77.zip | |
Challenge 2 - Perl
| -rw-r--r-- | challenge-100/lance-wicks/perl/ch-2.pl | 32 | ||||
| -rw-r--r-- | challenge-100/lance-wicks/perl/lib/Triangle.pm | 54 | ||||
| -rw-r--r-- | challenge-100/lance-wicks/perl/t/2-triangle.t | 27 |
3 files changed, 113 insertions, 0 deletions
diff --git a/challenge-100/lance-wicks/perl/ch-2.pl b/challenge-100/lance-wicks/perl/ch-2.pl new file mode 100644 index 0000000000..c397fea06b --- /dev/null +++ b/challenge-100/lance-wicks/perl/ch-2.pl @@ -0,0 +1,32 @@ +use strict; +use warnings; + +use lib './lib'; +use Triangle; + +my $tri = Triangle->new; + +# usage: +# perl ch-2.pl [[1], [2,4], [6,4,9], [5,1,7,2]] +# perl ch-2.pl [[3], [3,1], [5,2,3], [4,3,1,3]] + +my @triangle = parse(@ARGV); + +print "The minimum path sum: "; +print $tri->min_path_sum( \@triangle ); +print "\n"; + +sub parse { + my @rows = @_; + my @triangle; + + for my $row (@rows) { + $row =~ s/\[//g; + $row =~ s/\]//g; + + my @values = split ',', $row; + push @triangle, \@values; + } + + return @triangle; +} diff --git a/challenge-100/lance-wicks/perl/lib/Triangle.pm b/challenge-100/lance-wicks/perl/lib/Triangle.pm new file mode 100644 index 0000000000..0da6ad5289 --- /dev/null +++ b/challenge-100/lance-wicks/perl/lib/Triangle.pm @@ -0,0 +1,54 @@ +package Triangle; + +use Moo; + +use Data::Dumper; +$Data::Dumper::Sortkeys = 1; + +sub min_path_sum { + my ( $self, $triangle ) = @_; + + my $table = $self->triangle_to_table($triangle); + my $sum = $self->parse_table($table); + + return $sum; +} + +sub triangle_to_table { + my ( $self, $triangle ) = @_; + + my $max = @$triangle - 1; + for my $row_index ( 0 .. $max ) { + for my $column_index ( 0 .. $max ) { + $triangle->[$row_index][$column_index] //= 0; + } + } + + return $triangle; +} + +sub parse_table { + my ( $self, $table ) = @_; + + my $max = @$table - 1; + + for my $row_index ( reverse( 0 .. $max - 1 ) ) { + for my $column_index ( 0 .. $max - 1 ) { + if ( $table->[ $row_index + 1 ][$column_index] + < $table->[ $row_index + 1 ][ $column_index + 1 ] ) + { + $table->[$row_index][$column_index] + += $table->[ $row_index + 1 ][$column_index]; + } + else { + $table->[$row_index][$column_index] + += $table->[ $row_index + 1 ][ $column_index + 1 ]; + } + + } + } + + return $table->[0][0]; +} + +1; diff --git a/challenge-100/lance-wicks/perl/t/2-triangle.t b/challenge-100/lance-wicks/perl/t/2-triangle.t new file mode 100644 index 0000000000..00e9cd615e --- /dev/null +++ b/challenge-100/lance-wicks/perl/t/2-triangle.t @@ -0,0 +1,27 @@ +use Test2::V0 -target => 'Triangle'; + +subtest 'min_path_sum' => sub { + is $CLASS->min_path_sum( [ [1], [ 2, 4 ], [ 6, 4, 9 ], [ 5, 1, 7, 2 ] ] ), + 8, + 'Example 1 returns 8'; + + is $CLASS->min_path_sum( [ [3], [ 3, 1 ], [ 5, 2, 3 ], [ 4, 3, 1, 3 ] ] ), + 7, + 'Example 2 returns 7'; +}; + +subtest 'triangle_to_table' => sub { + my $in = [ [1], [ 2, 4 ], [ 6, 4, 9 ], [ 5, 1, 7, 2 ] ]; + my $expected + = [ [ 1, 0, 0, 0 ], [ 2, 4, 0, 0 ], [ 6, 4, 9, 0 ], [ 5, 1, 7, 2 ] ]; + is $CLASS->triangle_to_table($in), $expected, 'Example 1'; + + $in = [ [3], [ 3, 1 ], [ 5, 2, 3 ], [ 4, 3, 1, 3 ] ]; + $expected + = [ [ 3, 0, 0, 0 ], [ 3, 1, 0, 0 ], [ 5, 2, 3, 0 ], [ 4, 3, 1, 3 ] ]; + is $CLASS->triangle_to_table($in), $expected, 'Example 2'; +}; + +ok 1; + +done_testing; |
