diff options
| -rwxr-xr-x | challenge-016/roger-bell-west/perl5/ch-1.pl | 23 | ||||
| -rwxr-xr-x | challenge-016/roger-bell-west/perl5/ch-2.pl | 32 |
2 files changed, 55 insertions, 0 deletions
diff --git a/challenge-016/roger-bell-west/perl5/ch-1.pl b/challenge-016/roger-bell-west/perl5/ch-1.pl new file mode 100755 index 0000000000..685d34d982 --- /dev/null +++ b/challenge-016/roger-bell-west/perl5/ch-1.pl @@ -0,0 +1,23 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Math::BigFloat; + +my $n=$ARGV[0] || 100; + +my $remaining=Math::BigFloat->new(1); +my $max=0; +my $maxp=0; + +foreach my $participant (1..$n) { + my $portion=$remaining*$participant/$n; + if ($portion > $max) { + $max=$portion; + $maxp=$participant; + } + $remaining-=$portion; +} + +print "$maxp: $max\n"; diff --git a/challenge-016/roger-bell-west/perl5/ch-2.pl b/challenge-016/roger-bell-west/perl5/ch-2.pl new file mode 100755 index 0000000000..710c38c6fe --- /dev/null +++ b/challenge-016/roger-bell-west/perl5/ch-2.pl @@ -0,0 +1,32 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Encode::Base58::GMP; +use Math::GMPz qw(:mpz); +use Digest::SHA qw(sha256 sha256_hex); + +foreach my $address (@ARGV) { + unless ($address =~ /^[1-9A-HJ-NP-Za-km-z]*$/) { + warn "$address\ninvalid characters\n"; + next; + } + my $a=decode_base58($address,'bitcoin'); + my $ah=Rmpz_get_str($a,16); + if (length($ah)%2==1) { + $ah='0'.$ah; + } + my @e=($ah =~ /(..)/g); + while (scalar @e < 25) { + unshift @e,'00'; + } + my $cksum=join('',splice(@e,-4)); + my $raw=pack('C*',map {hex($_)} @e); + my $digest=substr(sha256_hex(sha256($raw)),0,8); + if ($digest eq $cksum) { + print join('',@e),"\n"; + } else { + warn "$address\nCalculated $digest does not match stored $cksum\n"; + } +} |
