aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLance Wicks <lw@judocoach.com>2021-02-20 13:43:13 +0000
committerLance Wicks <lw@judocoach.com>2021-02-20 13:43:13 +0000
commitd3823be9dcc5ba8cfc243dcf0ab04e8d374b7b77 (patch)
treeddedf4ebc36dbb5563e2eb8e10d0d700eea00116
parent6c7941137c37771eecd7e449bce54ab9bbbbd7ff (diff)
downloadperlweeklychallenge-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.pl32
-rw-r--r--challenge-100/lance-wicks/perl/lib/Triangle.pm54
-rw-r--r--challenge-100/lance-wicks/perl/t/2-triangle.t27
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;