aboutsummaryrefslogtreecommitdiff
path: root/challenge-126
diff options
context:
space:
mode:
authordrbaggy <js5@sanger.ac.uk>2021-08-16 12:31:23 +0100
committerdrbaggy <js5@sanger.ac.uk>2021-08-16 12:31:23 +0100
commitc6b2a4e90769b80b8099efdccde08151e388359f (patch)
treeb68235983e8ef1fc1e8049b596d44cf538f543f2 /challenge-126
parent588be19d6c9893bd6fa8e63e44f72147141e7705 (diff)
downloadperlweeklychallenge-club-c6b2a4e90769b80b8099efdccde08151e388359f.tar.gz
perlweeklychallenge-club-c6b2a4e90769b80b8099efdccde08151e388359f.tar.bz2
perlweeklychallenge-club-c6b2a4e90769b80b8099efdccde08151e388359f.zip
added a non-scan version
Diffstat (limited to 'challenge-126')
-rw-r--r--challenge-126/james-smith/perl/ch-1.pl23
1 files changed, 23 insertions, 0 deletions
diff --git a/challenge-126/james-smith/perl/ch-1.pl b/challenge-126/james-smith/perl/ch-1.pl
index ac845eee9a..e680e413c2 100644
--- a/challenge-126/james-smith/perl/ch-1.pl
+++ b/challenge-126/james-smith/perl/ch-1.pl
@@ -23,10 +23,18 @@ my @TESTS = (
[ 4000, 2187 ],
[ 5000, 2916 ],
[ 10000, 6560 ],
+ [ 20000, 6561 ],
+ [ 25000, 6561+2916 ],
+ [ 25500, 6561+2916+324 ],
+ [ 25540, 6561+2916+324+27 ],
+ [ 25543, 6561+2916+324+27+2 ],
[ 100000, 59048 ],
[ 1000000, 531440 ],
);
+# warn "@{$_} -> ", get_no_one_count_x($_->[0]), "\n" foreach @TESTS;
+
+is( get_no_one_count_x($_->[0]), $_->[1] ) foreach @TESTS;
is( get_no_one_count($_->[0]), $_->[1] ) foreach @TESTS;
done_testing();
@@ -35,3 +43,18 @@ sub get_no_one_count {
return scalar grep { ! m{1} } 2..$n;
}
+## Optimized version.... seems to work ... and far better than scan...
+sub get_no_one_count_x {
+ my $n = shift;
+ my $c = 0;
+ my $m = 1;
+ while($n) {
+ my $t=$n%10;
+ $c = 0 if $t==1;
+ $c += $t ? ( $t < 2 ? ($m-1) : ($t-1)*$m ) : 0;
+ $m *= 9;
+ $n= int($n/10);
+ }
+ return $c;
+}
+