aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-07-13 12:31:13 +0100
committerGitHub <noreply@github.com>2019-07-13 12:31:13 +0100
commit086eb2be97659cb98bc5503f96ee5c6944807311 (patch)
tree725a05cec7d09446f0250df37be120e4b93001e8
parentb94e1639165aca4efd887bbca145094875e7dd96 (diff)
parentc6315cece2b073b08a3fffb3e14088ff4ec88040 (diff)
downloadperlweeklychallenge-club-086eb2be97659cb98bc5503f96ee5c6944807311.tar.gz
perlweeklychallenge-club-086eb2be97659cb98bc5503f96ee5c6944807311.tar.bz2
perlweeklychallenge-club-086eb2be97659cb98bc5503f96ee5c6944807311.zip
Merge pull request #364 from drclaw1394/master
ruben/drclaw solutions to W16 CH1 and CH2. P5 and P6
-rw-r--r--challenge-016/ruben-westerberg/README18
-rwxr-xr-xchallenge-016/ruben-westerberg/perl5/ch-1.pl16
-rwxr-xr-xchallenge-016/ruben-westerberg/perl5/ch-2.pl41
-rwxr-xr-xchallenge-016/ruben-westerberg/perl6/ch-1.p612
-rwxr-xr-xchallenge-016/ruben-westerberg/perl6/ch-2.p629
5 files changed, 102 insertions, 14 deletions
diff --git a/challenge-016/ruben-westerberg/README b/challenge-016/ruben-westerberg/README
index e79fa3142b..f81c125353 100644
--- a/challenge-016/ruben-westerberg/README
+++ b/challenge-016/ruben-westerberg/README
@@ -2,20 +2,10 @@ Solution by Ruben Westerberg
ch-1.pl and ch-1.p6
===
-Run the script to generate the first 10 strong and 10 weak prime numbers
+Run the program to calculate which guest has the largest slice.
ch-2.pl and ch-2.p6
===
-Encode and decode with Vigenère cipher. Ascii leters (upper and lower case), space, and sample pucctuation characters are supported.
-Operation is performed on a line by line basis from standard input and printed to standard output
-
-To encode:
- ch-2.pl KEY
- where KEY is the key to encode with. Input data is read from stdin
-To decode:
- ch-2.pl -d KEY
- where KEY is the key used for encoding. Input data is read from stdin
-
-Loopback test:
- ./ch-2.pl "my key" | ./ch-2.pl -d "my key"
-
+Run the program to validate bitcoin address. Multiple addresses can be
+specified as command line arguments. With no arguments validates two
+test addresses.
diff --git a/challenge-016/ruben-westerberg/perl5/ch-1.pl b/challenge-016/ruben-westerberg/perl5/ch-1.pl
new file mode 100755
index 0000000000..f8d62b8953
--- /dev/null
+++ b/challenge-016/ruben-westerberg/perl5/ch-1.pl
@@ -0,0 +1,16 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use v5.26;
+my $i=0;
+for (1..100) {
+ state $rem=1;
+ my $slice=$_*0.01*$rem;
+ $rem-=$slice;
+ state $ps=0;
+ last if $slice < $ps;
+ $i=$_;
+ $ps=$slice;
+}
+
+print "Guest with largest slice: $i\n";
diff --git a/challenge-016/ruben-westerberg/perl5/ch-2.pl b/challenge-016/ruben-westerberg/perl5/ch-2.pl
new file mode 100755
index 0000000000..597b705f68
--- /dev/null
+++ b/challenge-016/ruben-westerberg/perl5/ch-2.pl
@@ -0,0 +1,41 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use bigint;
+use Digest::SHA qw(sha256);
+use List::Util qw(all any first);
+use v5.26;
+
+my @addresses=@ARGV;
+@addresses= qw<1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2
+ 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy> unless @addresses;
+
+my %b;
+my @valid=("1".."9","A".."H","J".."N","P".."Z","a".."k","m".."z");
+for (@valid) {
+ state $i=0;
+ $b{$_}=$i++;
+}
+
+for (@addresses) {
+ print "Testing Address: $_\n";
+ my $sum=0;
+ my @a=reverse (split ("", $_));
+ unless (all {my $t=$_; first {$t eq $_} @valid} @a) { print "Invalid characters found: $_\n"; next};
+
+ while (my ($k,$v)=each @a) {
+ $sum+=$b{$v} *(58**$k);;
+ }
+ my $bytes=$sum->as_bytes();
+ unless (length $bytes <= 25) { print "Invalid length: $_\n"; next }
+
+ my $buff='';
+ vec($buff,$_,8)=0x00 for (0..24); #zero 25 bytes
+ my $offset=length($buff)-length($bytes); #find where to insert
+ substr($buff,$offset,length($bytes),$bytes); #insert decoded bytes
+ my $check= substr(sha256(sha256(substr $buff,0,21)),0,4); #check
+ my $inCheck=substr($buff,21,4);
+ unless ($check eq $inCheck) { print "Check sum mismatch: $_\n"; next};
+
+ print "Address OK: $_\n\n";
+}
diff --git a/challenge-016/ruben-westerberg/perl6/ch-1.p6 b/challenge-016/ruben-westerberg/perl6/ch-1.p6
new file mode 100755
index 0000000000..5ebf683894
--- /dev/null
+++ b/challenge-016/ruben-westerberg/perl6/ch-1.p6
@@ -0,0 +1,12 @@
+#!/usr/bin/env perl6
+my $i=0;
+for (1..100) {
+ state $rem=1;
+ my $slice=$_*0.01*$rem;
+ $rem-=$slice;
+ state $ps=0;
+ last if $slice < $ps;
+ $i=$_;
+ $ps=$slice;
+}
+print "Guest with largest slice: $i\n";
diff --git a/challenge-016/ruben-westerberg/perl6/ch-2.p6 b/challenge-016/ruben-westerberg/perl6/ch-2.p6
new file mode 100755
index 0000000000..0a3a64c82a
--- /dev/null
+++ b/challenge-016/ruben-westerberg/perl6/ch-2.p6
@@ -0,0 +1,29 @@
+#!/usr/bin/env perl6
+use Digest::SHA;
+#
+my @addresses=@*ARGS;
+@addresses= qw<1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2
+ 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy> unless @addresses;
+
+my %b;
+my @valid=("1".."9","A".."H","J".."N","P".."Z","a".."k","m".."z").flat;
+%b{$_}=$++ for @valid;
+
+for (@addresses) {
+ print "Testing Address: $_\n";
+ unless so all(comb("",$_)) eq any(@valid) { print "Invalid characters found: $_\n"; next}
+ my Int $sum=0; #Int type grows as needed
+ my @a=reverse (comb("", $_));
+ for @a.kv {
+ $sum+=%b{$^v} *(58**$^k);
+ }
+ my $buff=Buf.new($sum.base(16).fmt("%050s").comb(2)>>.fmt("%02s")>>.parse-base(16));
+ unless ($buff.elems <= 25) { print "Invalid length: $_\n"; next }
+
+ $buff.unshift(0) while ($buff.elems < 25);
+ my $check= sha256(sha256($buff.subbuf(0,21))).subbuf(0,4);
+ my $inCheck=$buff.subbuf(21,4);
+ unless ($check eq $inCheck) { print "Check sum mismatch: $_\n"; next};
+ print "Address OK: $_\n\n";
+
+}