aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Smith <js5@sanger.ac.uk>2023-01-29 19:08:58 +0000
committerGitHub <noreply@github.com>2023-01-29 19:08:58 +0000
commitfe23e322916422d3390f559c41544aff4ee18ddb (patch)
treee05086ce08b75e2e301c454763200b1505187f7c
parent6eb6c608619f1bb9908d395e804bc9a9388f3d83 (diff)
downloadperlweeklychallenge-club-fe23e322916422d3390f559c41544aff4ee18ddb.tar.gz
perlweeklychallenge-club-fe23e322916422d3390f559c41544aff4ee18ddb.tar.bz2
perlweeklychallenge-club-fe23e322916422d3390f559c41544aff4ee18ddb.zip
Update ch-2.pl
-rw-r--r--challenge-201/james-smith/perl/ch-2.pl26
1 files changed, 18 insertions, 8 deletions
diff --git a/challenge-201/james-smith/perl/ch-2.pl b/challenge-201/james-smith/perl/ch-2.pl
index fd7f700762..64a80fcb84 100644
--- a/challenge-201/james-smith/perl/ch-2.pl
+++ b/challenge-201/james-smith/perl/ch-2.pl
@@ -5,34 +5,44 @@ use warnings;
use feature qw(say);
use Test::More;
use Benchmark qw(cmpthese timethis);
+use List::Util qw(sum0);
my @TESTS = ([5,7],[10,42],[15,176],[20,627],[25,1958],[30,5604],[35,14883],[40,37338],[45,89134],[50,204226]);
my %cache;
-is( piles( $_->[0]), $_->[1] ) for @TESTS;
-is( piles_2( $_->[0]), $_->[1] ) for @TESTS;
-is( piles_q( $_->[0]), $_->[1] ) for @TESTS;
+(%cache=()), is( piles( $_->[0]), $_->[1] ) for @TESTS;
+(%cache=()), is( piles_0( $_->[0]), $_->[1] ) for @TESTS;
+(%cache=()), is( piles_2( $_->[0]), $_->[1] ) for @TESTS;
+(%cache=()), is( piles_q( $_->[0]), $_->[1] ) for @TESTS;
done_testing();
-cmpthese( -3, {
- 'piles' => sub { %cache=(); piles( $_->[0] ) for @TESTS },
+cmpthese( -2, {
+ 'piles' => sub { %cache=(); piles( $_->[0] ) for @TESTS },
+ 'piles_0' => sub { %cache=(); piles_0( $_->[0] ) for @TESTS },
'piles_2' => sub { %cache=(); piles_2( $_->[0] ) for @TESTS },
- 'piles_q' => sub { piles_q( $_->[0] ) for @TESTS },
+ 'piles_q' => sub { %cache=(); piles_q( $_->[0] ) for @TESTS },
});
sub piles {
my($count,$n,$m)=(0,@_);
+ return 1 unless $n;
$m//=$n;
return $cache{"$n,$m"} if exists $cache{"$n,$m"};
- return $cache{"$n,$m"} = 1 unless $n;
$count += piles($n-$_,$_) for 1 .. ($m>$n?$n:$m);
$cache{"$n,$m"}||=$count;
}
+sub piles_0 {
+ return 1 unless $_[0];
+ $_[1]//=$_[0];
+ $cache{"@_"}//= sum0 map { piles_0( $_[0]-$_,$_ ) } 1 .. ($_[0]>$_[1]?$_[1]:$_[0]);
+}
+
sub piles_2 {
my($count,$n,$m)=(0,@_);
+ return 1 unless $n;
$m//=$n;
- $cache{"$n,$m"}//= $n ? sum_piles_2( $n, $m ) : 1;
+ $cache{"$n,$m"}//= sum_piles_2( $n, $m );
}
sub sum_piles_2 {