diff options
| author | drbaggy <js5@sanger.ac.uk> | 2021-11-23 07:24:37 +0000 |
|---|---|---|
| committer | drbaggy <js5@sanger.ac.uk> | 2021-11-23 07:24:37 +0000 |
| commit | da7f72157db87a1f448db7f426aeb30b4acbd10f (patch) | |
| tree | 4fa935673a8551cf1d334af7aa4d7418e9da86db | |
| parent | db6df2a5ea0ad435c2d5952632494c4b1894ef81 (diff) | |
| download | perlweeklychallenge-club-da7f72157db87a1f448db7f426aeb30b4acbd10f.tar.gz perlweeklychallenge-club-da7f72157db87a1f448db7f426aeb30b4acbd10f.tar.bz2 perlweeklychallenge-club-da7f72157db87a1f448db7f426aeb30b4acbd10f.zip | |
added more readable versions
| -rw-r--r-- | challenge-140/james-smith/perl/ch-1.pl | 23 | ||||
| -rw-r--r-- | challenge-140/james-smith/perl/ch-2.pl | 15 |
2 files changed, 36 insertions, 2 deletions
diff --git a/challenge-140/james-smith/perl/ch-1.pl b/challenge-140/james-smith/perl/ch-1.pl index c4d6576644..2129293473 100644 --- a/challenge-140/james-smith/perl/ch-1.pl +++ b/challenge-140/james-smith/perl/ch-1.pl @@ -16,6 +16,8 @@ my @TESTS = ( say DecBin->new($_->[0][0]) + DecBin->new($_->[0][1]) == DecBin->new($_->[1]) ? 'OK' : 'FAIL' foreach @TESTS; +say DecBinExp->new($_->[0][0]) + DecBinExp->new($_->[0][1]) == DecBinExp->new($_->[1]) ? 'OK' : 'FAIL' foreach @TESTS; + package DecBin; use overload ('+','bin_add','==','comp'); @@ -30,3 +32,24 @@ sub bin_add { DecBin->new($t); } +package DecBinExp; + +use overload ('+','bin_add','==','comp'); + +sub new { return bless \$_[1], $_[0]; } + +sub comp { ${$_[0]} == ${$_[1]}; } + +sub bin_add { + my($t,$c,$m,$a,$b) = (0,0,1,${$_[0]},${$_[1]}); + while ($a||$b||$c) { + $c += $a%10 + $b%10; + $t += $m * ($c&1); + $m *= 10; + $c >>= 1; + $a = int $a/10; + $b = int $b/10; + } + DecBin->new($t); +} + diff --git a/challenge-140/james-smith/perl/ch-2.pl b/challenge-140/james-smith/perl/ch-2.pl index 8f8e2545bc..849f946bb3 100644 --- a/challenge-140/james-smith/perl/ch-2.pl +++ b/challenge-140/james-smith/perl/ch-2.pl @@ -19,12 +19,23 @@ my @TESTS = ( ); is( get_num(@{$_->[0]}), $_->[1] ) foreach @TESTS; +is( get_num_exp(@{$_->[0]}), $_->[1] ) foreach @TESTS; done_testing(); sub get_num { - my($i,$j,$k,%h) = @_; - $a=$_, map { $h{$a*$_}++ } 1..$j for 1..$i; + my($i,$j,$k,$t,%h) = @_; + $t=$_, map { $h{$t*$_}++ } 1..$j for 1..$i; $k-=$h{$_}, ($k<1) && (return $_) for sort { $a<=>$b } keys %h; } +sub get_num_exp { + my($i,$j,$k,$t,%h) = @_; + foreach $t (1..$i) { + $h{$t*$_}++ foreach 1..$j; + } + for (sort {$a<=>$b} keys %h) { + $k -= $h{$_}; + return $_ if $k<1; + } +} |
