diff options
| author | Ruben Westerberg <drclaw@mac.com> | 2019-07-13 11:57:58 +1000 |
|---|---|---|
| committer | Ruben Westerberg <drclaw@mac.com> | 2019-07-13 11:57:58 +1000 |
| commit | c0865bbb87c1036394779a6e979cddba38ea0705 (patch) | |
| tree | 921d1baa5ea1b382fce9e5a587463ef177a93832 /challenge-016 | |
| parent | 20e0eea9e5da183cc865aef22e65b84db07d5d59 (diff) | |
| download | perlweeklychallenge-club-c0865bbb87c1036394779a6e979cddba38ea0705.tar.gz perlweeklychallenge-club-c0865bbb87c1036394779a6e979cddba38ea0705.tar.bz2 perlweeklychallenge-club-c0865bbb87c1036394779a6e979cddba38ea0705.zip | |
Added/fixed all solutions p5 and p6
Reread the ch-1 problem statement and rewrote my solution! hah hah
Diffstat (limited to 'challenge-016')
| -rw-r--r-- | challenge-016/ruben-westerberg/README | 18 | ||||
| -rwxr-xr-x | challenge-016/ruben-westerberg/perl5/ch-1.pl | 15 | ||||
| -rwxr-xr-x | challenge-016/ruben-westerberg/perl5/ch-2.pl | 23 | ||||
| -rwxr-xr-x | challenge-016/ruben-westerberg/perl6/ch-1.p6 | 13 | ||||
| -rwxr-xr-x | challenge-016/ruben-westerberg/perl6/ch-2.p6 | 29 |
5 files changed, 66 insertions, 32 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 index 322be07838..f8d62b8953 100755 --- a/challenge-016/ruben-westerberg/perl5/ch-1.pl +++ b/challenge-016/ruben-westerberg/perl5/ch-1.pl @@ -2,10 +2,15 @@ use strict; use warnings; use v5.26; - my $i=0; -while (1) { - state $sum+=++$i; - last if $sum > 100; +for (1..100) { + state $rem=1; + my $slice=$_*0.01*$rem; + $rem-=$slice; + state $ps=0; + last if $slice < $ps; + $i=$_; + $ps=$slice; } -print --$i."\n"; + +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 index b9b9e40927..8ea3fb954f 100755 --- a/challenge-016/ruben-westerberg/perl5/ch-2.pl +++ b/challenge-016/ruben-westerberg/perl5/ch-2.pl @@ -1,8 +1,8 @@ #!/usr/bin/env perl use strict; use warnings; -use bigint;; -use Digest::SHA qw(sha256 sha256_hex); +use bigint; +use Digest::SHA qw(sha256); use v5.26; my @addresses=@ARGV; @@ -18,21 +18,22 @@ for ("1".."9","A".."H","J".."N","P".."Z","a".."k","m".."z") { for (@addresses) { print "Testing Address: $_\n"; if (/[IlO]/) { print "Invalid characters found: $_\n"; next}; + my $sum=0; my @a=reverse (split ("", $_)); while (my ($k,$v)=each @a) { - my $in=$b{$v}; - $sum+=$in *(58**$k);; + $sum+=$b{$v} *(58**$k);; } my $bytes=$sum->as_bytes(); - unless (length $bytes <= 25) { print "Invalid length: $_\n";next } + unless (length $bytes <= 25) { print "Invalid length: $_\n"; next } + my $buff=''; - vec($buff,$_,8)=0x00 for (0..24); - my $offset=length($buff)-length($bytes); - substr($buff,$offset,length($bytes),$bytes); - my $check= substr(sha256(sha256(substr $buff,0,21)),0,4); + 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"; + 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 index f4f5285fba..5ebf683894 100755 --- a/challenge-016/ruben-westerberg/perl6/ch-1.p6 +++ b/challenge-016/ruben-westerberg/perl6/ch-1.p6 @@ -1,3 +1,12 @@ #!/usr/bin/env perl6 - - put ([\+] (1 .. 100)).grep(* < 100)[*-1]:k + 1; +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..ba859c705d --- /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; +%b{$_}=$++ for ("1".."9","A".."H","J".."N","P".."Z","a".."k","m".."z").flat; + +for (@addresses) { + print "Testing Address: $_\n"; + if (/<[IlO]>/) { 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"; + +} |
