From bdf1b4bcf50dfc25cab5afcd5d98ff40223abb76 Mon Sep 17 00:00:00 2001 From: Flavio Poletti Date: Thu, 1 Oct 2020 22:45:06 +0200 Subject: Add polettix's solution to PWC080 --- challenge-080/polettix/blog.txt | 1 + challenge-080/polettix/blog1.txt | 1 + challenge-080/polettix/perl/ch-1.pl | 22 ++++++++++++++++++++++ challenge-080/polettix/perl/ch-2.pl | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 challenge-080/polettix/blog.txt create mode 100644 challenge-080/polettix/blog1.txt create mode 100644 challenge-080/polettix/perl/ch-1.pl create mode 100644 challenge-080/polettix/perl/ch-2.pl 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->@*); +} -- cgit