aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-07-20 23:15:32 +0100
committerGitHub <noreply@github.com>2019-07-20 23:15:32 +0100
commita5bff3a85fffe574729cd6e12c20d5cf7f269260 (patch)
tree2429d7c7a74d8a54bcdc5306644cf4c367319acf
parentd5027eba3e22a63dc5a4b8eacc0a91d922fb074c (diff)
parent38f9d7bf2a82341db06e92e3289748f386d0abfe (diff)
downloadperlweeklychallenge-club-a5bff3a85fffe574729cd6e12c20d5cf7f269260.tar.gz
perlweeklychallenge-club-a5bff3a85fffe574729cd6e12c20d5cf7f269260.tar.bz2
perlweeklychallenge-club-a5bff3a85fffe574729cd6e12c20d5cf7f269260.zip
Merge pull request #396 from drclaw1394/master
drclaw/ruben solutions to W17 Ch1 and Ch2. P5 and P6
-rw-r--r--challenge-017/ruben-westerberg/README9
-rwxr-xr-xchallenge-017/ruben-westerberg/perl5/ch-1.pl34
-rwxr-xr-xchallenge-017/ruben-westerberg/perl5/ch-2.pl32
-rwxr-xr-xchallenge-017/ruben-westerberg/perl6/ch-1.p629
-rwxr-xr-xchallenge-017/ruben-westerberg/perl6/ch-2.p634
5 files changed, 134 insertions, 4 deletions
diff --git a/challenge-017/ruben-westerberg/README b/challenge-017/ruben-westerberg/README
index f81c125353..14ffe9e086 100644
--- a/challenge-017/ruben-westerberg/README
+++ b/challenge-017/ruben-westerberg/README
@@ -2,10 +2,11 @@ Solution by Ruben Westerberg
ch-1.pl and ch-1.p6
===
-Run the program to calculate which guest has the largest slice.
+Run the program to with two arguments to calculate the Ackerman value of them
+Displays the current recusrion count as a progress indicator and displays the
+calculated value and total recursion count as last output.
ch-2.pl and ch-2.p6
===
-Run the program to validate bitcoin address. Multiple addresses can be
-specified as command line arguments. With no arguments validates two
-test addresses.
+Run the program with a command line argument (in single quotes). The argument is a URL to validate.
+With no command line argument, uses builtin test URI
diff --git a/challenge-017/ruben-westerberg/perl5/ch-1.pl b/challenge-017/ruben-westerberg/perl5/ch-1.pl
new file mode 100755
index 0000000000..ac612388c1
--- /dev/null
+++ b/challenge-017/ruben-westerberg/perl5/ch-1.pl
@@ -0,0 +1,34 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use List::Util qw<min>;
+use v5.26;
+die "Need two arguments: m n" unless @ARGV ==2;
+die "Arguments need to be 0 or positive" unless (min(@ARGV) >=0);
+
+my ($m,$n)=@ARGV;
+
+my ($ack,$iter)=acker($m,$n);
+print "Ackerman value for (m=$m, n=$n): $ack in $iter recursions\n";
+
+sub acker {
+ my $counter=0;
+ my $iacker;
+ $iacker=sub { #need to use a sub reference to avoid 'not shared' warning for $counter;
+ my ($m,$n)=@_;
+ $counter++; #Increment the recursion counter for informational purposes.
+ print "Recursion $counter\n";
+ my $y;
+ if ($m==0) { $y=$n+1 }
+ else {
+ if ($n==0) {
+ $y=&$iacker($m-1,1);
+ }
+ else {
+ $y=&$iacker($m-1,&$iacker($m,$n-1));
+ }
+ }
+ $y;
+ };
+ (&$iacker(@_), $counter); #Call internal ackerman function.
+}
diff --git a/challenge-017/ruben-westerberg/perl5/ch-2.pl b/challenge-017/ruben-westerberg/perl5/ch-2.pl
new file mode 100755
index 0000000000..b0b1e2c592
--- /dev/null
+++ b/challenge-017/ruben-westerberg/perl5/ch-2.pl
@@ -0,0 +1,32 @@
+#!/usr/bin/env perl
+#
+use strict;
+use warnings;
+use v5.26;
+
+my $frag=qr/[\w\d]+/;
+my $qval=qr/[\w\d]+/;
+my $qkey=qr/[\w\d]+/;
+my $qpair=qr/$qkey\=$qval/;
+my $query=qr/$qpair(?:\&$qpair)*/;
+my $port=qr/\d+/;
+my $path=qr/(\/(?:[\w\d\.]+\/?)*)/;
+my $host=qr/[\w\d\.]+/;
+my $user=qr/[\w\d]+/;
+my $pass=qr/[\w\d]+/;
+my $auth=qr/\/\/(?:($user)(?:\:($pass))?\@)?($host)(?:\:($port))?/;
+my $scheme=qr/([a-z][a-z\-\.\+]+)/;
+my $URI='jdbc://user:password@localhost:3306/pwc?profile=true#h1>';
+my $match=($ARGV[0]//$URI)=~/$scheme\:$auth?$path(?:\?($query))?(?:\#($frag))?/;
+die "Not a URI\n" unless $match;
+my @out=(
+ "Scheme: ".($1//""),
+ "User: ".($2//""),
+ "Password: ".($3//""),
+ "Host: ".($4//""),
+ "Port: ".($5//""),
+ "Path ".($6//""),
+ "Query: ".($7//""),
+ "Fragment: ".($8//""),
+);
+print join "\n", @out;
diff --git a/challenge-017/ruben-westerberg/perl6/ch-1.p6 b/challenge-017/ruben-westerberg/perl6/ch-1.p6
new file mode 100755
index 0000000000..d69402f921
--- /dev/null
+++ b/challenge-017/ruben-westerberg/perl6/ch-1.p6
@@ -0,0 +1,29 @@
+#!/usr/bin/env perl6
+die "Need two arguments: m n" unless @*ARGS ==2;
+die "Arguments need to be 0 or positive" unless (min(@*ARGS) >=0);
+my ($m,$n)=@*ARGS;
+
+my ($ack,$iter)=acker($m,$n);
+put "Ackerman value for (m=$m, n=$n): $ack in $iter recursions";
+
+
+sub acker($m,$n){
+ my $counter; ##Use dynamic variable as counter. Wrap in lexical scope.
+ sub iacker (\m,\n) {
+ $counter++; #Increment the recursion counter for informational purposes.
+ say "Recursion "~$counter;
+ my $y;
+ if m==0 { $y=n+1}
+ else {
+ if n==0 {
+ $y= iacker(m-1,1);
+ }
+ else {
+ $y= iacker(m-1,iacker(m,n-1));
+ }
+ }
+ $y;
+ }
+ (iacker($m,$n), $counter); #Call internal ackerman function.
+}
+
diff --git a/challenge-017/ruben-westerberg/perl6/ch-2.p6 b/challenge-017/ruben-westerberg/perl6/ch-2.p6
new file mode 100755
index 0000000000..2462d35b9f
--- /dev/null
+++ b/challenge-017/ruben-westerberg/perl6/ch-2.p6
@@ -0,0 +1,34 @@
+#!/usr/bin/env perl6
+#
+grammar URI {
+ token TOP {<scheme>\:<authority>?<path>[\?<query>]?[\#<fragment>]?};##|<authority>};
+ token scheme { :i(<alpha>[<[\-\.\+] + alnum>]*)};
+ token path { (\/[<alnum>\/?]*)+};
+ token authority { (\/\/)[<user>[\:<password>]?\@]?<host>[\:<port>]?};
+ token user { (<alnum>+)};
+ token password { ( <alnum> +)};
+
+ token host { (<alnum>+)};
+ token port { (<alnum>+)};
+ token query { <qpair>[\&<qpair>]*};
+ token qpair { (<qkey>\=<qval>)+};
+ token qkey {<alnum>+};
+ token qval {<alnum>+};
+ token fragment { (<alnum>+)};
+}
+
+my $m=URI.parse(@*ARGS[0]//"jdbc://user:password@localhost:3306/pwc?profile=true#h1");
+die "Not a URI\n" unless $m;
+given $m {
+ put "Scheme: {.<scheme>}";
+ given .<authority> {
+ put "User: {.<user>//""}";
+ put "Password: {.<password>//""}";
+ put "Host: {.<host>//""}";
+ put "Port: {.<port>//""}";
+ }
+ put "Path: {.<path>//""}";
+ put "Query: {.<query>//""}";
+ put "Fragment: {.<fragment>//""}";
+
+}