diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-02-20 17:40:52 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-20 17:40:52 +0000 |
| commit | 306677a4731f6c92e279163045d454b25b67da9e (patch) | |
| tree | 4e6809c20740e64eea6cde117b55c30d0c9c74cc | |
| parent | 0617dd595c13afcdf7e30ab9525b6b52ebea8284 (diff) | |
| parent | d69680a090a88c683ea9615b46ac3d8919ed1242 (diff) | |
| download | perlweeklychallenge-club-306677a4731f6c92e279163045d454b25b67da9e.tar.gz perlweeklychallenge-club-306677a4731f6c92e279163045d454b25b67da9e.tar.bz2 perlweeklychallenge-club-306677a4731f6c92e279163045d454b25b67da9e.zip | |
Merge pull request #3581 from lancew/branch-for-challenge-100
Challenge 2 - Perl
| -rw-r--r-- | challenge-100/lance-wicks/blog.txt | 1 | ||||
| -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 |
4 files changed, 114 insertions, 0 deletions
diff --git a/challenge-100/lance-wicks/blog.txt b/challenge-100/lance-wicks/blog.txt index 7877d60421..44d12e6846 100644 --- a/challenge-100/lance-wicks/blog.txt +++ b/challenge-100/lance-wicks/blog.txt @@ -1 +1,2 @@ https://perl.kiwi/tales/2021/02/18/perlm-for-the-perl-weekly-challenge-100/ +https://perl.kiwi/tales/2021/02/20/perl_weekly_challenge_100_part_2/ 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; |
