aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrbaggy <js5@sanger.ac.uk>2021-11-23 07:24:37 +0000
committerdrbaggy <js5@sanger.ac.uk>2021-11-23 07:24:37 +0000
commitda7f72157db87a1f448db7f426aeb30b4acbd10f (patch)
tree4fa935673a8551cf1d334af7aa4d7418e9da86db
parentdb6df2a5ea0ad435c2d5952632494c4b1894ef81 (diff)
downloadperlweeklychallenge-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.pl23
-rw-r--r--challenge-140/james-smith/perl/ch-2.pl15
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;
+ }
+}