aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-07-09 13:06:29 +0100
committerGitHub <noreply@github.com>2019-07-09 13:06:29 +0100
commitcd0c73e3388d7d0855bdee36e68edf6c978f2a6e (patch)
tree4c041e801641dc8c43e989967a3a01370d79e2f1
parentea3a62e5bb2fe9dbacd3cd0d990fcf1f070ed517 (diff)
parent273acb420be06491652e97b8e5473e4e91b33284 (diff)
downloadperlweeklychallenge-club-cd0c73e3388d7d0855bdee36e68edf6c978f2a6e.tar.gz
perlweeklychallenge-club-cd0c73e3388d7d0855bdee36e68edf6c978f2a6e.tar.bz2
perlweeklychallenge-club-cd0c73e3388d7d0855bdee36e68edf6c978f2a6e.zip
Merge pull request #355 from Firedrake/rogerbw-016
Roger's solution. I hate everything to do with Bitcoin.
-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";
+ }
+}