diff options
| author | drbaggy <js5@sanger.ac.uk> | 2021-08-16 12:31:23 +0100 |
|---|---|---|
| committer | drbaggy <js5@sanger.ac.uk> | 2021-08-16 12:31:23 +0100 |
| commit | c6b2a4e90769b80b8099efdccde08151e388359f (patch) | |
| tree | b68235983e8ef1fc1e8049b596d44cf538f543f2 /challenge-126 | |
| parent | 588be19d6c9893bd6fa8e63e44f72147141e7705 (diff) | |
| download | perlweeklychallenge-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.pl | 23 |
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; +} + |
