diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2019-07-13 12:31:13 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-07-13 12:31:13 +0100 |
| commit | 086eb2be97659cb98bc5503f96ee5c6944807311 (patch) | |
| tree | 725a05cec7d09446f0250df37be120e4b93001e8 | |
| parent | b94e1639165aca4efd887bbca145094875e7dd96 (diff) | |
| parent | c6315cece2b073b08a3fffb3e14088ff4ec88040 (diff) | |
| download | perlweeklychallenge-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/README | 18 | ||||
| -rwxr-xr-x | challenge-016/ruben-westerberg/perl5/ch-1.pl | 16 | ||||
| -rwxr-xr-x | challenge-016/ruben-westerberg/perl5/ch-2.pl | 41 | ||||
| -rwxr-xr-x | challenge-016/ruben-westerberg/perl6/ch-1.p6 | 12 | ||||
| -rwxr-xr-x | challenge-016/ruben-westerberg/perl6/ch-2.p6 | 29 |
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"; + +} |
