From 7ee9a1595d0d3eb6b56bf0adc01d1631a3679a1b Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Tue, 16 Jul 2019 21:40:08 +1000 Subject: Added solutions to W17 ch1 p5 and p6 --- challenge-017/ruben-westerberg/README | 7 +++--- challenge-017/ruben-westerberg/perl5/ch-1.pl | 34 ++++++++++++++++++++++++++++ challenge-017/ruben-westerberg/perl6/ch-1.p6 | 29 ++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-) create mode 100755 challenge-017/ruben-westerberg/perl5/ch-1.pl create mode 100755 challenge-017/ruben-westerberg/perl6/ch-1.p6 diff --git a/challenge-017/ruben-westerberg/README b/challenge-017/ruben-westerberg/README index f81c125353..1c2593c999 100644 --- a/challenge-017/ruben-westerberg/README +++ b/challenge-017/ruben-westerberg/README @@ -2,10 +2,9 @@ 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. 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; +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/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. +} + -- cgit From 3c4cb2454d629dff131ce8ff9dd7056255b28d13 Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Fri, 19 Jul 2019 21:55:23 +1000 Subject: Added ch2 solution for p6 First time using grammars --- challenge-017/ruben-westerberg/perl6/ch-2.p6 | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 challenge-017/ruben-westerberg/perl6/ch-2.p6 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..0d6d955f9d --- /dev/null +++ b/challenge-017/ruben-westerberg/perl6/ch-2.p6 @@ -0,0 +1,40 @@ +#!/usr/bin/env perl6 +# +grammar URI { + token TOP {\:?[\?]?[\#]?};##|}; + token scheme { :i([<[\-\.\+] + alnum>]*)}; + token path { (\/*)+}; + token authority { (\/\/)[[\:]?\@]?[\:]?}; + token user { (+)}; + token password { ( +)}; + + token host { (+)}; + token port { (+)}; + token query { [\&]*}; + token qpair { (\=)+}; + token qkey {+}; + token qval {+}; + token fragment { (+)}; + ##token query { \?+}; + ##token fragment { + }; +} + ##|()??}; + + +#say URI.parse("jdbc://user:password@localhost:3306/pwc?profile=true#h1"); +my $m=URI.parse(@*ARGS[0]); +die "Not a URI\n" unless $m; +#say $m; +given $m { + put "Scheme: {.}"; + given . { + put "User: {.}"; + put "Password: {.//""}"; + put "Host: {.}"; + put "Port: {.//""}"; + } + put "Path: {.//""}"; + put "Query: {.//""}"; + put "Fragment: {.//""}"; + +} -- cgit From c63269a7a17da013a0f5bde97899323e34c84905 Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Sat, 20 Jul 2019 17:12:37 +1000 Subject: Added ch2 solutions --- challenge-017/ruben-westerberg/README | 1 + challenge-017/ruben-westerberg/perl5/ch-2.pl | 31 ++++++++++++++++++++++++++++ challenge-017/ruben-westerberg/perl6/ch-2.p6 | 12 +++-------- 3 files changed, 35 insertions(+), 9 deletions(-) create mode 100755 challenge-017/ruben-westerberg/perl5/ch-2.pl diff --git a/challenge-017/ruben-westerberg/README b/challenge-017/ruben-westerberg/README index 1c2593c999..36e90655e8 100644 --- a/challenge-017/ruben-westerberg/README +++ b/challenge-017/ruben-westerberg/README @@ -8,3 +8,4 @@ calculated value and total recursion count as last output. ch-2.pl and ch-2.p6 === +Run the program with a command line argument (in single quotes). The argument is a URL to validate. 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..4441008227 --- /dev/null +++ b/challenge-017/ruben-westerberg/perl5/ch-2.pl @@ -0,0 +1,31 @@ +#!/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 $match=$ARGV[0]=~/$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-2.p6 b/challenge-017/ruben-westerberg/perl6/ch-2.p6 index 0d6d955f9d..9ec56c4730 100755 --- a/challenge-017/ruben-westerberg/perl6/ch-2.p6 +++ b/challenge-017/ruben-westerberg/perl6/ch-2.p6 @@ -3,7 +3,7 @@ grammar URI { token TOP {\:?[\?]?[\#]?};##|}; token scheme { :i([<[\-\.\+] + alnum>]*)}; - token path { (\/*)+}; + token path { (\/[\/?]*)+}; token authority { (\/\/)[[\:]?\@]?[\:]?}; token user { (+)}; token password { ( +)}; @@ -15,22 +15,16 @@ grammar URI { token qkey {+}; token qval {+}; token fragment { (+)}; - ##token query { \?+}; - ##token fragment { + }; } - ##|()??}; - -#say URI.parse("jdbc://user:password@localhost:3306/pwc?profile=true#h1"); my $m=URI.parse(@*ARGS[0]); die "Not a URI\n" unless $m; -#say $m; given $m { put "Scheme: {.}"; given . { - put "User: {.}"; + put "User: {.//""}"; put "Password: {.//""}"; - put "Host: {.}"; + put "Host: {.//""}"; put "Port: {.//""}"; } put "Path: {.//""}"; -- cgit From 38f9d7bf2a82341db06e92e3289748f386d0abfe Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Sun, 21 Jul 2019 08:11:15 +1000 Subject: Added default case for ch2. + Readme --- challenge-017/ruben-westerberg/README | 1 + challenge-017/ruben-westerberg/perl5/ch-2.pl | 5 +++-- challenge-017/ruben-westerberg/perl6/ch-2.p6 | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/challenge-017/ruben-westerberg/README b/challenge-017/ruben-westerberg/README index 36e90655e8..14ffe9e086 100644 --- a/challenge-017/ruben-westerberg/README +++ b/challenge-017/ruben-westerberg/README @@ -9,3 +9,4 @@ calculated value and total recursion count as last output. ch-2.pl and ch-2.p6 === 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-2.pl b/challenge-017/ruben-westerberg/perl5/ch-2.pl index 4441008227..b0b1e2c592 100755 --- a/challenge-017/ruben-westerberg/perl5/ch-2.pl +++ b/challenge-017/ruben-westerberg/perl5/ch-2.pl @@ -10,13 +10,14 @@ 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 $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 $match=$ARGV[0]=~/$scheme\:$auth?$path(?:\?($query))?(?:\#($frag))?/; +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//""), diff --git a/challenge-017/ruben-westerberg/perl6/ch-2.p6 b/challenge-017/ruben-westerberg/perl6/ch-2.p6 index 9ec56c4730..2462d35b9f 100755 --- a/challenge-017/ruben-westerberg/perl6/ch-2.p6 +++ b/challenge-017/ruben-westerberg/perl6/ch-2.p6 @@ -17,7 +17,7 @@ grammar URI { token fragment { (+)}; } -my $m=URI.parse(@*ARGS[0]); +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: {.}"; -- cgit