From 0e1e852931172c60c7b64b5c97111464dafe4094 Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Mon, 8 Jul 2019 13:46:34 +1000 Subject: Added Ch-1 solutions p5 and p6 --- challenge-016/ruben-westerberg/perl5/ch-1.pl | 11 +++++++++++ challenge-016/ruben-westerberg/perl6/ch-1.p6 | 3 +++ 2 files changed, 14 insertions(+) create mode 100755 challenge-016/ruben-westerberg/perl5/ch-1.pl create mode 100755 challenge-016/ruben-westerberg/perl6/ch-1.p6 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..322be07838 --- /dev/null +++ b/challenge-016/ruben-westerberg/perl5/ch-1.pl @@ -0,0 +1,11 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use v5.26; + +my $i=0; +while (1) { + state $sum+=++$i; + last if $sum > 100; +} +print --$i."\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..f4f5285fba --- /dev/null +++ b/challenge-016/ruben-westerberg/perl6/ch-1.p6 @@ -0,0 +1,3 @@ +#!/usr/bin/env perl6 + + put ([\+] (1 .. 100)).grep(* < 100)[*-1]:k + 1; -- cgit From 20e0eea9e5da183cc865aef22e65b84db07d5d59 Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Fri, 12 Jul 2019 23:21:55 +1000 Subject: Added ch-2 p5 solution --- challenge-016/ruben-westerberg/perl5/ch-2.pl | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100755 challenge-016/ruben-westerberg/perl5/ch-2.pl 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..b9b9e40927 --- /dev/null +++ b/challenge-016/ruben-westerberg/perl5/ch-2.pl @@ -0,0 +1,38 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use bigint;; +use Digest::SHA qw(sha256 sha256_hex); +use v5.26; + +my @addresses=@ARGV; +@addresses= qw<1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2 + 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy> unless @addresses; + +my %b; +for ("1".."9","A".."H","J".."N","P".."Z","a".."k","m".."z") { + state $i=0; + $b{$_}=$i++; +} + +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);; + } + my $bytes=$sum->as_bytes(); + 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); + my $inCheck=substr($buff,21,4); + unless ($check eq $inCheck) { print "Check sum mismatch: $_\n";next}; + print "Address OK: $_\n\n"; + +} -- cgit From c0865bbb87c1036394779a6e979cddba38ea0705 Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Sat, 13 Jul 2019 11:57:58 +1000 Subject: Added/fixed all solutions p5 and p6 Reread the ch-1 problem statement and rewrote my solution! hah hah --- challenge-016/ruben-westerberg/README | 18 ++++------------- challenge-016/ruben-westerberg/perl5/ch-1.pl | 15 +++++++++----- challenge-016/ruben-westerberg/perl5/ch-2.pl | 23 +++++++++++----------- challenge-016/ruben-westerberg/perl6/ch-1.p6 | 13 +++++++++++-- challenge-016/ruben-westerberg/perl6/ch-2.p6 | 29 ++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 32 deletions(-) create mode 100755 challenge-016/ruben-westerberg/perl6/ch-2.p6 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"; + +} -- cgit From c6315cece2b073b08a3fffb3e14088ff4ec88040 Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Sat, 13 Jul 2019 12:39:13 +1000 Subject: Improved validation of characters --- challenge-016/ruben-westerberg/perl5/ch-2.pl | 8 +++++--- challenge-016/ruben-westerberg/perl6/ch-2.p6 | 10 +++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/challenge-016/ruben-westerberg/perl5/ch-2.pl b/challenge-016/ruben-westerberg/perl5/ch-2.pl index 8ea3fb954f..597b705f68 100755 --- a/challenge-016/ruben-westerberg/perl5/ch-2.pl +++ b/challenge-016/ruben-westerberg/perl5/ch-2.pl @@ -3,6 +3,7 @@ use strict; use warnings; use bigint; use Digest::SHA qw(sha256); +use List::Util qw(all any first); use v5.26; my @addresses=@ARGV; @@ -10,17 +11,18 @@ my @addresses=@ARGV; 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy> unless @addresses; my %b; -for ("1".."9","A".."H","J".."N","P".."Z","a".."k","m".."z") { +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"; - if (/[IlO]/) { print "Invalid characters found: $_\n"; next}; - 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);; } diff --git a/challenge-016/ruben-westerberg/perl6/ch-2.p6 b/challenge-016/ruben-westerberg/perl6/ch-2.p6 index ba859c705d..0a3a64c82a 100755 --- a/challenge-016/ruben-westerberg/perl6/ch-2.p6 +++ b/challenge-016/ruben-westerberg/perl6/ch-2.p6 @@ -6,24 +6,24 @@ my @addresses=@*ARGS; 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy> unless @addresses; my %b; -%b{$_}=$++ for ("1".."9","A".."H","J".."N","P".."Z","a".."k","m".."z").flat; +my @valid=("1".."9","A".."H","J".."N","P".."Z","a".."k","m".."z").flat; +%b{$_}=$++ for @valid; for (@addresses) { print "Testing Address: $_\n"; - if (/<[IlO]>/) { print "Invalid characters found: $_\n"; next}; - + 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 } + 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}; + unless ($check eq $inCheck) { print "Check sum mismatch: $_\n"; next}; print "Address OK: $_\n\n"; } -- cgit