Skip to content

Commit

Permalink
Simpler version for arbitrarilly large numbers.
Browse files Browse the repository at this point in the history
  • Loading branch information
jaredor committed May 9, 2020
1 parent 545b1ac commit 43761bc
Showing 1 changed file with 15 additions and 26 deletions.
41 changes: 15 additions & 26 deletions challenge-059/jaredor/perl/ch-2.pl
Original file line number Diff line number Diff line change
Expand Up @@ -4,46 +4,35 @@
use warnings;
use bigint;
use Config;
use List::Util qw(all sum max);
use List::Util qw(all sum);

# 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 @nums = map { pack "${NN}*", $_ } @ARGV;
my ( $LL, $NN ) =
defined $Config{longlongsize}
? ( 8 * $Config{longlongsize}, 'Q' )
: ( 8 * $Config{longsize}, 'L' );

my $WORD = 2**$LL;

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 ];
sub num2bitstr {
my ( $numstr, $bitstr ) = ( $_[0], );
$bitstr .= pack "${NN}", $numstr % $WORD and $numstr /= $WORD while $numstr;
return $bitstr;
}

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

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

0 comments on commit 43761bc

Please sign in to comment.