aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2023-01-29 17:46:32 +0000
committerGitHub <noreply@github.com>2023-01-29 17:46:32 +0000
commit43e51aace521869142d8a8ac87674f19d38b2777 (patch)
tree47769588e21d48cc1523351970ead2f9a72c5c99
parent34865f44a440ac76be00bce9051da8d82ea75da8 (diff)
parent55a9892a8b3bf44ad2675fd54f5231ab33f7313b (diff)
downloadperlweeklychallenge-club-43e51aace521869142d8a8ac87674f19d38b2777.tar.gz
perlweeklychallenge-club-43e51aace521869142d8a8ac87674f19d38b2777.tar.bz2
perlweeklychallenge-club-43e51aace521869142d8a8ac87674f19d38b2777.zip
Merge pull request #7484 from polettix/polettix/pwc201
Add polettix's solution to challenge-201
-rw-r--r--challenge-201/polettix/blog.txt1
-rw-r--r--challenge-201/polettix/blog1.txt1
-rw-r--r--challenge-201/polettix/perl/ch-1.pl12
-rw-r--r--challenge-201/polettix/perl/ch-2.pl83
-rw-r--r--challenge-201/polettix/raku/ch-1.raku8
-rw-r--r--challenge-201/polettix/raku/ch-2.raku43
6 files changed, 148 insertions, 0 deletions
diff --git a/challenge-201/polettix/blog.txt b/challenge-201/polettix/blog.txt
new file mode 100644
index 0000000000..f17a8636ab
--- /dev/null
+++ b/challenge-201/polettix/blog.txt
@@ -0,0 +1 @@
+https://etoobusy.polettix.it/2023/01/26/pwc201-missing-numbers/
diff --git a/challenge-201/polettix/blog1.txt b/challenge-201/polettix/blog1.txt
new file mode 100644
index 0000000000..6f5fc4ec28
--- /dev/null
+++ b/challenge-201/polettix/blog1.txt
@@ -0,0 +1 @@
+https://etoobusy.polettix.it/2023/01/27/pwc201-penny-piles/
diff --git a/challenge-201/polettix/perl/ch-1.pl b/challenge-201/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..703b29f83f
--- /dev/null
+++ b/challenge-201/polettix/perl/ch-1.pl
@@ -0,0 +1,12 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+
+say for missing_numbers(@ARGV);
+
+sub missing_numbers (@array) {
+ my %set = map { $_ => 1 } @array;
+ grep { ! exists($set{$_}) } 0 .. @array;
+}
diff --git a/challenge-201/polettix/perl/ch-2.pl b/challenge-201/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..c80ec50a9c
--- /dev/null
+++ b/challenge-201/polettix/perl/ch-2.pl
@@ -0,0 +1,83 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+
+my $n = shift // 5;
+say scalar penny_piles_recursive($n)->@*;
+say scalar penny_piles_iterative($n)->@*;
+
+my $count = 0;
+my $it = penny_piles_iterator($n);
+while (my $seq = $it->()) {
+ #say "$seq->@*";
+ ++$count;
+}
+say $count;
+
+sub penny_piles_iterator ($n) {
+ my @trail;
+ my @stack = ($n);
+ return sub {
+ my $retval = undef;
+ while (@stack && ! $retval) {
+ $retval = [@trail] if $stack[-1] == 0;
+ if (@trail < @stack) { # initialize
+ my $min = @trail ? $trail[-1] : 1;
+ push @trail, $min;
+ }
+ else { # continue this frame's iteration
+ $trail[-1]++;
+ }
+ if ($trail[-1] <= $stack[-1]) { # "recurse"
+ push @stack, $stack[-1] - $trail[-1];
+ }
+ else { # "return"
+ pop @trail;
+ pop @stack;
+ }
+ }
+ return $retval;
+ };
+}
+
+sub penny_piles_iterative ($n) {
+ my @valid;
+ my @trail;
+ my @stack = ($n);
+ while (@stack) {
+ push @valid, [@trail] if $stack[-1] == 0;
+ if (@trail < @stack) { # initialize
+ my $min = @trail ? $trail[-1] : 1;
+ push @trail, $min;
+ }
+ else { # continue this frame's iteration
+ $trail[-1]++;
+ }
+ if ($trail[-1] <= $stack[-1]) { # "recurse"
+ push @stack, $stack[-1] - $trail[-1];
+ }
+ else { # "return"
+ pop @trail;
+ pop @stack;
+ }
+ }
+ return \@valid;
+}
+
+sub penny_piles_recursive ($n) {
+ my @valid;
+ my @trail;
+ sub ($n) {
+ push @valid, [@trail] if $n == 0;
+ my $min = @trail ? $trail[-1] : 1;
+ push @trail, $min;
+ while ($trail[-1] <= $n) {
+ __SUB__->($n - $trail[-1]);
+ ++$trail[-1];
+ }
+ pop @trail;
+ }->($n);
+ return \@valid;
+}
diff --git a/challenge-201/polettix/raku/ch-1.raku b/challenge-201/polettix/raku/ch-1.raku
new file mode 100644
index 0000000000..c75f58d113
--- /dev/null
+++ b/challenge-201/polettix/raku/ch-1.raku
@@ -0,0 +1,8 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN (*@args) { .put for missing-numbers(@args) }
+
+sub missing-numbers (@array) {
+ my $present = @array».Str.Set;
+ return [(0 .. @array.elems).grep({ $_.Str ∉ $present })];
+}
diff --git a/challenge-201/polettix/raku/ch-2.raku b/challenge-201/polettix/raku/ch-2.raku
new file mode 100644
index 0000000000..377af83015
--- /dev/null
+++ b/challenge-201/polettix/raku/ch-2.raku
@@ -0,0 +1,43 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN (Int $n where * > 0 = 5) {
+ class PennyPilesIterator { ... }
+ my $it = PennyPilesIterator.new($n);
+ while defined(my $seq = $it.next) {
+ $seq.say
+ }
+ put $it.count;
+}
+
+class PennyPilesIterator {
+ has @!trail is built;
+ has @!stack is built;
+ has $.count = 0;
+
+ method new ($n) { self.bless(trail => [], stack => [$n]) }
+
+ method next () {
+ my $retval = Nil;
+ while (@!stack && ! $retval) {
+ if @!stack[*-1] == 0 {
+ $retval = [ |@!trail ];
+ ++$!count;
+ }
+ if (@!trail < @!stack) { # initialize
+ my $min = @!trail ?? @!trail[*-1] !! 1;
+ @!trail.push: $min;
+ }
+ else { # continue this frame's iteration
+ @!trail[*-1]++;
+ }
+ if (@!trail[*-1] <= @!stack[*-1]) { # "recurse"
+ @!stack.push: @!stack[*-1] - @!trail[*-1];
+ }
+ else { # "return"
+ @!trail.pop;
+ @!stack.pop;
+ }
+ }
+ return $retval;
+ }
+}