diff options
| author | Flavio Poletti <flavio@polettix.it> | 2023-01-29 18:34:58 +0100 |
|---|---|---|
| committer | Flavio Poletti <flavio@polettix.it> | 2023-01-29 18:34:58 +0100 |
| commit | 55a9892a8b3bf44ad2675fd54f5231ab33f7313b (patch) | |
| tree | ed3fc05f6919db21e5bd9e954073c95fffda8787 | |
| parent | 18f57b402d576194dd58876a3a81f82330935e24 (diff) | |
| download | perlweeklychallenge-club-55a9892a8b3bf44ad2675fd54f5231ab33f7313b.tar.gz perlweeklychallenge-club-55a9892a8b3bf44ad2675fd54f5231ab33f7313b.tar.bz2 perlweeklychallenge-club-55a9892a8b3bf44ad2675fd54f5231ab33f7313b.zip | |
Add polettix's solution to challenge-201
| -rw-r--r-- | challenge-201/polettix/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-201/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-201/polettix/perl/ch-1.pl | 12 | ||||
| -rw-r--r-- | challenge-201/polettix/perl/ch-2.pl | 83 | ||||
| -rw-r--r-- | challenge-201/polettix/raku/ch-1.raku | 8 | ||||
| -rw-r--r-- | challenge-201/polettix/raku/ch-2.raku | 43 |
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; + } +} |
