aboutsummaryrefslogtreecommitdiff
path: root/challenge-100/james-smith/perl
diff options
context:
space:
mode:
authordrbaggy <js5@sanger.ac.uk>2021-02-17 06:11:48 +0000
committerdrbaggy <js5@sanger.ac.uk>2021-02-17 06:11:48 +0000
commit92ded7e7669934eeec6d9c04448c550b3530cd81 (patch)
tree1c92c25826da2b59d4365f17ee3df5fba962dbc7 /challenge-100/james-smith/perl
parent8d068cc245cfc1346cb8fd7e34914b954b1ec9c9 (diff)
downloadperlweeklychallenge-club-92ded7e7669934eeec6d9c04448c550b3530cd81.tar.gz
perlweeklychallenge-club-92ded7e7669934eeec6d9c04448c550b3530cd81.tar.bz2
perlweeklychallenge-club-92ded7e7669934eeec6d9c04448c550b3530cd81.zip
add code to make fns non destructive - and a "test" to test this
Diffstat (limited to 'challenge-100/james-smith/perl')
-rw-r--r--challenge-100/james-smith/perl/ch-2.pl17
1 files changed, 16 insertions, 1 deletions
diff --git a/challenge-100/james-smith/perl/ch-2.pl b/challenge-100/james-smith/perl/ch-2.pl
index 6ffe7fc6e3..46a05310f1 100644
--- a/challenge-100/james-smith/perl/ch-2.pl
+++ b/challenge-100/james-smith/perl/ch-2.pl
@@ -6,6 +6,15 @@ use warnings;
use feature qw(say);
use Test::More;
+## A little check to see if the sum functions are
+## non-destructive...
+my @Q = ( [1],[2,4],[6,4,9],[5,1,7,2] );
+triangle_sum_1point5_liner( @Q );
+is( triangle_sum_1point5_liner( @Q ), 8 );
+@Q = ( [1],[2,4],[6,4,9],[5,1,7,2] );
+triangle_sum( @Q );
+is( triangle_sum( @Q ), 8 );
+
is( triangle_sum( [1],[2,4],[6,4,9],[5,1,7,2] ), 8 );
is( triangle_sum( [3],[3,1],[5,2,3],[4,3,1,3] ), 7 );
is( triangle_sum( [3],[3,1],[3,8,9],[4,3,1,3] ), 12 );
@@ -37,7 +46,7 @@ display_sum( [3],[6,4],[5,2,7],[9,1,8,6] );
## repeating until the triangle only has a single cell the answer..
sub triangle_sum {
- my @tri = @_;
+ my @tri = map{ [@{$_}] } @_;
while(@tri>1) {
## Strip off base of triangle...
my $b = pop @tri;
@@ -49,6 +58,11 @@ sub triangle_sum {
return $tri[0][0];
}
+## First thing we do is make a deep copy of @_ as this like the
+## previous function is destructive. @_ is an array of references
+## and although manipulating @_ doesn't affect the variable passed
+## in it does affect the contents of any references passed in.
+##
## We can convert the inner for loop into a map... and pop the value
## of $b in the while clause so we can simplify this down to a single
## one line statement, with the return just returning the last
@@ -57,6 +71,7 @@ sub triangle_sum {
## so not quite a 1 liner - but close enough!!
sub triangle_sum_1point5_liner {
+ @_ = map{ [@{$_}] } @_; ## Deep copy as destructive..
@{$_[-1]} = map {
$_[-1][$_] + $b->[ $b->[$_] < $b->[$_+1] ? $_ : $_+1 ]
} 0..@_-1 while @{$b=pop @_}>1;