diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2020-05-06 07:09:40 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-06 07:09:40 +0100 |
| commit | 6e060b9b0f727d047ac11ba73a7fe68c5c9ce3ae (patch) | |
| tree | df1a59aa047ea23a1abf9c8cc5d4cc1681f55099 /challenge-059 | |
| parent | e6b2e1e0b572d4388a2db9721d2d50640e5718d6 (diff) | |
| parent | 6588912d49aa9fa99705a4c8de4f23fff2b41af7 (diff) | |
| download | perlweeklychallenge-club-6e060b9b0f727d047ac11ba73a7fe68c5c9ce3ae.tar.gz perlweeklychallenge-club-6e060b9b0f727d047ac11ba73a7fe68c5c9ce3ae.tar.bz2 perlweeklychallenge-club-6e060b9b0f727d047ac11ba73a7fe68c5c9ce3ae.zip | |
Merge pull request #1676 from choroba/ech059b
Include faster implementation of Bit Sum
Diffstat (limited to 'challenge-059')
| -rwxr-xr-x | challenge-059/e-choroba/perl/ch-2.pl | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/challenge-059/e-choroba/perl/ch-2.pl b/challenge-059/e-choroba/perl/ch-2.pl index 6eee2084c1..f9cde1626c 100755 --- a/challenge-059/e-choroba/perl/ch-2.pl +++ b/challenge-059/e-choroba/perl/ch-2.pl @@ -19,6 +19,29 @@ sub chain_diff_bits { return $s } +sub chain_diff_bits2 { + my (@list) = @_; + my @binary = map { unpack 'b*', pack N => $_ } @list; + my $s = 0; + for my $pos (0 .. length($binary[0]) - 1) { + my $ones = grep $_, map { substr $_, $pos, 1 } @binary; + $s += $ones * (@list - $ones); + } + return $s +} + +sub chain_diff_bits3 { + my (@list) = @_; + my $s = 0; + my $mask = 1; + for (1 .. 8 * length $list[0]) { + my $ones = grep $mask & $_, @list; + $mask <<= 1; + $s += $ones * (@list - $ones); + } + return $s +} + use Test::More; is diff_bits(0, 0), 0, 'd 0 0'; @@ -32,6 +55,12 @@ is diff_bits(113, 68), 4, 'd 113 68'; is chain_diff_bits(2, 3, 4), 6, 'chain 2 3 4'; is chain_diff_bits(89, 106, 116), 12, 'chain 89, 106, 116'; +is chain_diff_bits2(2, 3, 4), 6, 'chain 2 3 4'; +is chain_diff_bits2(89, 106, 116), 12, 'chain 89, 106, 116'; + +is chain_diff_bits3(2, 3, 4), 6, 'chain 2 3 4'; +is chain_diff_bits3(89, 106, 116), 12, 'chain 89, 106, 116'; + =heading1 Last test explained 89 | 1 1 1 0 1 0 0 @@ -42,4 +71,18 @@ is chain_diff_bits(89, 106, 116), 12, 'chain 89, 106, 116'; =cut +my @l = map int rand 100, 1 .. 1000; + +is chain_diff_bits(@l), + chain_diff_bits2(@l), 'same 1 2'; +is chain_diff_bits2(@l), + chain_diff_bits3(@l), 'same 2 3'; + done_testing(); + +use Benchmark qw{ cmpthese }; +cmpthese(-2, { + new => sub { chain_diff_bits2(@l) }, + old => sub { chain_diff_bits(@l) }, + newest => sub { chain_diff_bits3(@l) } +}); |
