diff options
| author | James Smith <js5@sanger.ac.uk> | 2023-01-29 19:08:58 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-29 19:08:58 +0000 |
| commit | fe23e322916422d3390f559c41544aff4ee18ddb (patch) | |
| tree | e05086ce08b75e2e301c454763200b1505187f7c | |
| parent | 6eb6c608619f1bb9908d395e804bc9a9388f3d83 (diff) | |
| download | perlweeklychallenge-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.pl | 26 |
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 { |
