From fe23e322916422d3390f559c41544aff4ee18ddb Mon Sep 17 00:00:00 2001 From: James Smith Date: Sun, 29 Jan 2023 19:08:58 +0000 Subject: Update ch-2.pl --- challenge-201/james-smith/perl/ch-2.pl | 26 ++++++++++++++++++-------- 1 file 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 { -- cgit