diff options
| author | Ruben Westerberg <drclaw@mac.com> | 2019-07-16 21:40:08 +1000 |
|---|---|---|
| committer | Ruben Westerberg <drclaw@mac.com> | 2019-07-16 21:40:08 +1000 |
| commit | 7ee9a1595d0d3eb6b56bf0adc01d1631a3679a1b (patch) | |
| tree | af7beb9241c865398dd98ff92a6db53de1dd9e24 | |
| parent | c55b121b94c4d771cfe1d70b4430cf23d73a6b13 (diff) | |
| download | perlweeklychallenge-club-7ee9a1595d0d3eb6b56bf0adc01d1631a3679a1b.tar.gz perlweeklychallenge-club-7ee9a1595d0d3eb6b56bf0adc01d1631a3679a1b.tar.bz2 perlweeklychallenge-club-7ee9a1595d0d3eb6b56bf0adc01d1631a3679a1b.zip | |
Added solutions to W17 ch1 p5 and p6
| -rw-r--r-- | challenge-017/ruben-westerberg/README | 7 | ||||
| -rwxr-xr-x | challenge-017/ruben-westerberg/perl5/ch-1.pl | 34 | ||||
| -rwxr-xr-x | challenge-017/ruben-westerberg/perl6/ch-1.p6 | 29 |
3 files changed, 66 insertions, 4 deletions
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<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/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. +} + |
