aboutsummaryrefslogtreecommitdiff
path: root/challenge-112
diff options
context:
space:
mode:
authordrbaggy <js5@sanger.ac.uk>2021-05-14 11:05:26 +0100
committerdrbaggy <js5@sanger.ac.uk>2021-05-14 11:05:26 +0100
commitddbafbec215102ed8c9c783cb86854a3ebe2d170 (patch)
tree09600cae70c2c48e1d01633ede1255474c139454 /challenge-112
parent299611489f84e646577d3bbb170bfcea5cf3eab6 (diff)
downloadperlweeklychallenge-club-ddbafbec215102ed8c9c783cb86854a3ebe2d170.tar.gz
perlweeklychallenge-club-ddbafbec215102ed8c9c783cb86854a3ebe2d170.tar.bz2
perlweeklychallenge-club-ddbafbec215102ed8c9c783cb86854a3ebe2d170.zip
push some changes to cacheing
Diffstat (limited to 'challenge-112')
-rw-r--r--challenge-112/james-smith/perl/ch-2.pl24
1 files changed, 23 insertions, 1 deletions
diff --git a/challenge-112/james-smith/perl/ch-2.pl b/challenge-112/james-smith/perl/ch-2.pl
index 541c0eb97b..65bd0ad0c9 100644
--- a/challenge-112/james-smith/perl/ch-2.pl
+++ b/challenge-112/james-smith/perl/ch-2.pl
@@ -3,7 +3,7 @@
use strict;
use warnings;
-use feature qw(say);
+use feature qw(say state);
use Test::More;
use Benchmark qw(cmpthese);
@@ -15,16 +15,23 @@ close $fh;
my $N = @ARGV ? $ARGV[0] : 30;
my $I = @ARGV > 1 ? $ARGV[1] : 100_000;
my $cache;
+my @glob_cache = (1,1);
is(climb( $_), $ans[$_] ) foreach 0..$N;
+is(climb_cache( $_), $ans[$_] ) foreach 0..$N;
+is(climb_cache_glob( $_), $ans[$_] ) foreach 0..$N;
is(climb_fib( $_), $ans[$_] ) foreach 0..$N;
is(climb_fib_1liner( $_), $ans[$_] ) foreach 0..$N;
is(climb_fib_approx( $_), $ans[$_] ) foreach 0..$N;
+is(climb_lookup( $_), $ans[$_] ) foreach 0..$N;
done_testing();
cmpthese($I,{
'climb' => sub { climb( $_ ) foreach 0..$N; },
+ 'cache' => sub { climb_cache( $_ ) foreach 0..$N; },
+ 'g-cch' => sub { climb_cache_glob( $_ ) foreach 0..$N; },
+ 'look' => sub { climb_lookup( $_ ) foreach 0..$N; },
'fib' => sub { climb_fib( $_ ) foreach 0..$N; },
'fib-1' => sub { climb_fib_1liner( $_ ) foreach 0..$N; },
'fib-a' => sub { climb_fib_approx( $_ ) foreach 0..$N; },
@@ -56,6 +63,17 @@ sub climb {
return $b;
}
+sub climb_cache {
+ state @cache = (1,1);
+ $cache[$_]=$cache[$_-1]+$cache[$_-2] foreach @cache .. $_[0];
+ return $cache[$_[0]];
+}
+
+sub climb_cache_glob {
+ $glob_cache[$_]=$glob_cache[$_-1]+$glob_cache[$_-2] foreach @glob_cache .. $_[0];
+ return $glob_cache[$_[0]];
+}
+
sub climb_fib {
my $q = ((1 + sqrt 5)/2)**($_[0]+1);
return int(0.001+ ($q - ($_[0]&1?1:-1)/$q)*sqrt 0.2);
@@ -68,3 +86,7 @@ sub climb_fib_1liner {
sub climb_fib_approx {
return int(0.4 + (0.5+sqrt 1.25)**($_[0]+1)*sqrt 0.2);
}
+
+sub climb_lookup {
+ return $ans[$_[0]];
+}