Skip to content

Commit

Permalink
use bigint and chop arbitrarilly large numbers into words to be bitwi…
Browse files Browse the repository at this point in the history
…se diffed.
  • Loading branch information
jaredor committed May 9, 2020
1 parent 177df50 commit 545b1ac
Showing 1 changed file with 29 additions and 9 deletions.
38 changes: 29 additions & 9 deletions challenge-059/jaredor/perl/ch-2.pl
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,48 @@

use v5.012;
use warnings;
use bigint;
use Config;
use List::Util qw(all sum);
use List::Util qw(all sum max);

# PWC 059, TASK #2 : Bit Sum

# Answer based on perl doc for unpack and www.perlmonks.org/?node_id=407933

my ( $LL, $NN ) =
defined $Config{longlongsize}
? ( 8 * $Config{longlongsize}, 'Q' )
: ( 8 * $Config{longsize}, 'L' );

my $CHOP_SIZE = 2**${LL};
my $CHOP_ZERO = pack "${NN}", 0;

die "This script requires one or more positive integer arguments."
unless @ARGV;

die "Not all arguments to the script are positive integers."
unless all { /\A [1-9] \d* \Z/xms } @ARGV;

my ( $LL, $NN ) =
defined $Config{longlongsize}
? ( 8 * $Config{longlongsize}, 'Q' )
: ( 8 * $Config{longsize}, 'L' );
#my @nums = map { pack "${NN}*", $_ } @ARGV;

sub chop_up {
my ( $num, @chopped ) = ( 0 + $_[0], );
while ($num) {
push @chopped, $num % $CHOP_SIZE;
$num = int( $num / $CHOP_SIZE );
}
return [ map { pack "${NN}", $_ } @chopped ];
}

my @nums = map { pack "${NN}*", $_ } @ARGV;
my @nums = map { chop_up $_ } @ARGV;
my $chops = max map { $#$_ } @nums;
( $chops - $#$_ ) and push @$_, ($CHOP_ZERO) x ( $chops - $#$_ ) for @nums;

my ( @diffbits, $num );
while ( $num = pop @nums ) {
push @diffbits, unpack( "%${LL}b*", $num ^ $_ ) for @nums;
my ( @diffbits, $numa );
while ( $numa = shift @nums ) {
for my $numb (@nums) {
push @diffbits, unpack( "%${LL}b*", $numa->[$_] ^ $numb->[$_] )
for 0 .. $chops;
}
}
say @diffbits ? sum @diffbits : 0;

0 comments on commit 545b1ac

Please sign in to comment.