aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuben Westerberg <drclaw@mac.com>2019-07-16 21:40:08 +1000
committerRuben Westerberg <drclaw@mac.com>2019-07-16 21:40:08 +1000
commit7ee9a1595d0d3eb6b56bf0adc01d1631a3679a1b (patch)
treeaf7beb9241c865398dd98ff92a6db53de1dd9e24
parentc55b121b94c4d771cfe1d70b4430cf23d73a6b13 (diff)
downloadperlweeklychallenge-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/README7
-rwxr-xr-xchallenge-017/ruben-westerberg/perl5/ch-1.pl34
-rwxr-xr-xchallenge-017/ruben-westerberg/perl6/ch-1.p629
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.
+}
+