aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulio <julio.dcs@gmail.com>2020-09-27 03:15:16 +0200
committerJulio <julio.dcs@gmail.com>2020-09-27 03:15:16 +0200
commit6d394bbf6e88c3a3221bc74fd8accbe4240df14e (patch)
tree2d4bb0e9c40d583ccd4d22baf89d61db1924241b
parentca7bab766928cad6fd56416a884553f4a0778480 (diff)
downloadperlweeklychallenge-club-6d394bbf6e88c3a3221bc74fd8accbe4240df14e.tar.gz
perlweeklychallenge-club-6d394bbf6e88c3a3221bc74fd8accbe4240df14e.tar.bz2
perlweeklychallenge-club-6d394bbf6e88c3a3221bc74fd8accbe4240df14e.zip
Update ch-1.pl solution to work with bigints
-rw-r--r--challenge-079/juliodcs/perl/ch-1.pl8
1 files changed, 2 insertions, 6 deletions
diff --git a/challenge-079/juliodcs/perl/ch-1.pl b/challenge-079/juliodcs/perl/ch-1.pl
index 5409ee8c5a..d88040dd85 100644
--- a/challenge-079/juliodcs/perl/ch-1.pl
+++ b/challenge-079/juliodcs/perl/ch-1.pl
@@ -14,16 +14,15 @@ use strict;
use warnings;
use feature 'say';
use experimental 'signatures';
+use bigint;
use constant MODULE => 1000000007;
-use constant INTEGER_LAST => 2**63 - 1;
-
use constant W_ACCURATE => 'Warning: intermediate result > Integer\'last. Result *may* not be accurate!';
use constant E_ACCURATE => 'Error: Number cannot be > Integer\'last';
use constant E_NO_NUMBER => 'You need to submit a number';
sub length_bin($number) {
- length sprintf '%b', $number;
+ Math::BigInt->new($number)->blog(2) + 1
}
# Given a number, it calculates the flips of the most-significant-bit number
@@ -40,7 +39,6 @@ sub next_number($number) {
sub calculate ( $number, $total = 0 ) {
if ( $number == 0 ) {
- say {*STDERR} W_ACCURATE if $total > INTEGER_LAST;
return $total % MODULE;
}
@@ -57,6 +55,4 @@ my $number = shift // q();
die E_NO_NUMBER if $number !~ m{^\d+$}sxm;
-die E_ACCURATE if $number > INTEGER_LAST;
-
say 'Result: ' . calculate($number);