aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Poletti <flavio@polettix.it>2020-10-01 22:45:06 +0200
committerFlavio Poletti <flavio@polettix.it>2020-10-01 22:45:06 +0200
commitbdf1b4bcf50dfc25cab5afcd5d98ff40223abb76 (patch)
tree9ad8ce9abc92161b81caf1cbef20c7008dc3ac03
parent75e3cdb13bd64a8a414eca37c8dccadff8c3ae59 (diff)
downloadperlweeklychallenge-club-bdf1b4bcf50dfc25cab5afcd5d98ff40223abb76.tar.gz
perlweeklychallenge-club-bdf1b4bcf50dfc25cab5afcd5d98ff40223abb76.tar.bz2
perlweeklychallenge-club-bdf1b4bcf50dfc25cab5afcd5d98ff40223abb76.zip
Add polettix's solution to PWC080
-rw-r--r--challenge-080/polettix/blog.txt1
-rw-r--r--challenge-080/polettix/blog1.txt1
-rw-r--r--challenge-080/polettix/perl/ch-1.pl22
-rw-r--r--challenge-080/polettix/perl/ch-2.pl36
4 files changed, 60 insertions, 0 deletions
diff --git a/challenge-080/polettix/blog.txt b/challenge-080/polettix/blog.txt
new file mode 100644
index 0000000000..ea612989bd
--- /dev/null
+++ b/challenge-080/polettix/blog.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2020/09/30/pwc080-smallest-positive-number/
diff --git a/challenge-080/polettix/blog1.txt b/challenge-080/polettix/blog1.txt
new file mode 100644
index 0000000000..50b3eebdad
--- /dev/null
+++ b/challenge-080/polettix/blog1.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2020/10/02/pwc080-count-candies/
diff --git a/challenge-080/polettix/perl/ch-1.pl b/challenge-080/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..3d7c46e5ca
--- /dev/null
+++ b/challenge-080/polettix/perl/ch-1.pl
@@ -0,0 +1,22 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use English qw< -no_match_vars >;
+use experimental qw< postderef >;
+no warnings qw< experimental::postderef >;
+
+sub spnb {
+ my @Np = (0, sort(grep { $_ > 0 } @_));
+ push @Np, $Np[-1] + 2;
+ (($Np[$_] + 1 < $Np[$_ + 1]) && return $Np[$_] + 1) for 0 .. $#Np - 1;
+}
+
+for my $test (
+ [ 5, 2, -2, 0 ],
+ [ 1, 8, -1 ],
+ [2, 0, -1 ],
+ [],
+ [1, 2, 3],
+ ) {
+ say spnb($test->@*);
+}
diff --git a/challenge-080/polettix/perl/ch-2.pl b/challenge-080/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..9b8d3b0720
--- /dev/null
+++ b/challenge-080/polettix/perl/ch-2.pl
@@ -0,0 +1,36 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use English qw< -no_match_vars >;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+use List::Util qw< max sum >;
+
+sub candies_for_candidates (@N) {
+ return unless @N;
+
+ my @candies = (1) x @N; # everybody gets a candy!
+ push @N, max($N[0], $N[-1]) + 1; # add "edge" value to simplify loops
+
+ while ('necessary') {
+ my $something_changed = 0;
+ for my $i (0 .. $#candies) {
+ for my $delta (-1, 1) {
+ next if $N[$i] <= $N[$i + $delta];
+ next if $candies[$i] > $candies[$i + $delta];
+ $candies[$i] = $candies[$i + $delta] + 1;
+ $something_changed = 1;
+ }
+ }
+ last unless $something_changed;
+ }
+ return sum @candies;
+}
+
+for my $test (
+ [ 1, 2, 2 ],
+ [ 1, 3, 4, 1 ],
+ [ 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7 ],
+ ) {
+ say candies_for_candidates($test->@*);
+}