aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchallenge-016/roger-bell-west/perl5/ch-1.pl23
-rwxr-xr-xchallenge-016/roger-bell-west/perl5/ch-2.pl32
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";
+ }
+}