diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2019-07-20 23:15:32 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-07-20 23:15:32 +0100 |
| commit | a5bff3a85fffe574729cd6e12c20d5cf7f269260 (patch) | |
| tree | 2429d7c7a74d8a54bcdc5306644cf4c367319acf | |
| parent | d5027eba3e22a63dc5a4b8eacc0a91d922fb074c (diff) | |
| parent | 38f9d7bf2a82341db06e92e3289748f386d0abfe (diff) | |
| download | perlweeklychallenge-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/README | 9 | ||||
| -rwxr-xr-x | challenge-017/ruben-westerberg/perl5/ch-1.pl | 34 | ||||
| -rwxr-xr-x | challenge-017/ruben-westerberg/perl5/ch-2.pl | 32 | ||||
| -rwxr-xr-x | challenge-017/ruben-westerberg/perl6/ch-1.p6 | 29 | ||||
| -rwxr-xr-x | challenge-017/ruben-westerberg/perl6/ch-2.p6 | 34 |
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>//""}"; + +} |
