aboutsummaryrefslogtreecommitdiff
path: root/challenge-016
diff options
context:
space:
mode:
authorRuben Westerberg <drclaw@mac.com>2019-07-13 11:57:58 +1000
committerRuben Westerberg <drclaw@mac.com>2019-07-13 11:57:58 +1000
commitc0865bbb87c1036394779a6e979cddba38ea0705 (patch)
tree921d1baa5ea1b382fce9e5a587463ef177a93832 /challenge-016
parent20e0eea9e5da183cc865aef22e65b84db07d5d59 (diff)
downloadperlweeklychallenge-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/README18
-rwxr-xr-xchallenge-016/ruben-westerberg/perl5/ch-1.pl15
-rwxr-xr-xchallenge-016/ruben-westerberg/perl5/ch-2.pl23
-rwxr-xr-xchallenge-016/ruben-westerberg/perl6/ch-1.p613
-rwxr-xr-xchallenge-016/ruben-westerberg/perl6/ch-2.p629
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";
+
+}