aboutsummaryrefslogtreecommitdiff
path: root/challenge-079
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-09-24 08:16:26 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-09-24 08:16:26 +0100
commitfa61e79d8cd5ea9ff11e2883f4ff649fac0c4c39 (patch)
tree3e5b228c5f7ec5e03cfac29f19f47a3b63902bbb /challenge-079
parent070b9341842cb5af7a1d80cd613db851331077f3 (diff)
downloadperlweeklychallenge-club-fa61e79d8cd5ea9ff11e2883f4ff649fac0c4c39.tar.gz
perlweeklychallenge-club-fa61e79d8cd5ea9ff11e2883f4ff649fac0c4c39.tar.bz2
perlweeklychallenge-club-fa61e79d8cd5ea9ff11e2883f4ff649fac0c4c39.zip
- Added solutions by Laurent Rosenfeld.
Diffstat (limited to 'challenge-079')
-rw-r--r--challenge-079/laurent-rosenfeld/blog.txt1
-rw-r--r--challenge-079/laurent-rosenfeld/perl/ch-1.pl10
-rw-r--r--challenge-079/laurent-rosenfeld/perl/ch-2.pl50
-rw-r--r--challenge-079/laurent-rosenfeld/raku/ch-1.sh1
-rw-r--r--challenge-079/laurent-rosenfeld/raku/ch-2.raku32
5 files changed, 94 insertions, 0 deletions
diff --git a/challenge-079/laurent-rosenfeld/blog.txt b/challenge-079/laurent-rosenfeld/blog.txt
new file mode 100644
index 0000000000..15f7c0b465
--- /dev/null
+++ b/challenge-079/laurent-rosenfeld/blog.txt
@@ -0,0 +1 @@
+http://blogs.perl.org/users/laurent_r/2020/09/perl-weekly-challenge-79-count-set-bits-and-trapped-rain-water.html
diff --git a/challenge-079/laurent-rosenfeld/perl/ch-1.pl b/challenge-079/laurent-rosenfeld/perl/ch-1.pl
new file mode 100644
index 0000000000..4033707433
--- /dev/null
+++ b/challenge-079/laurent-rosenfeld/perl/ch-1.pl
@@ -0,0 +1,10 @@
+use strict;
+use warnings;
+use feature "say";
+
+my $n = shift;
+my $sum;
+for my $num (1..$n) {
+ $sum += $_ for split '', sprintf "%b", $num;
+}
+say $sum % 1000000007;
diff --git a/challenge-079/laurent-rosenfeld/perl/ch-2.pl b/challenge-079/laurent-rosenfeld/perl/ch-2.pl
new file mode 100644
index 0000000000..33f6f1cc2e
--- /dev/null
+++ b/challenge-079/laurent-rosenfeld/perl/ch-2.pl
@@ -0,0 +1,50 @@
+use strict;
+use warnings;
+use feature "say";
+
+my @a = @ARGV > 1 ? @ARGV : ( 2, 1, 4, 5, 3, 7);
+draw_histo(@a);
+say "Rain capacity is: ", capacity(@a);
+
+sub max {
+ my @vals = @_;
+ my $max = shift @vals;
+ for my $val (@vals) {
+ $max = $val if $val > $max;
+ }
+ return $max;
+}
+
+sub min2 {
+ $_[0] < $_[1] ? $_[0] : $_[1];
+}
+
+sub draw_histo {
+ my @in = @_;
+ my $max_val = max @in;
+ say "";
+ for my $ordinate (reverse 1..$max_val) {
+ print $ordinate;
+ for my $i (0..$#in) {
+ print $in[$i] >= $ordinate ? " # " : " ";
+ }
+ say "";
+ }
+ say " =" x scalar @in;
+ say " ", join " ", @in;
+ say "";
+}
+
+sub capacity {
+ my @in = @_;
+ my $left_max = $in[0];
+ my $total = 0;
+ for my $i (1..$#in-1) {
+ $left_max = $in[$i] and next if $in[$i] > $left_max;
+ my $right_max = max @in[$i+1..$#in];
+ my $col = min2($left_max, $right_max) - $in[$i];
+ next if $col < 0;
+ $total += $col;
+ }
+ return $total
+}
diff --git a/challenge-079/laurent-rosenfeld/raku/ch-1.sh b/challenge-079/laurent-rosenfeld/raku/ch-1.sh
new file mode 100644
index 0000000000..c6f7baba11
--- /dev/null
+++ b/challenge-079/laurent-rosenfeld/raku/ch-1.sh
@@ -0,0 +1 @@
+raku -e 'say ([+] map { .fmt("%b").comb.sum }, 1..@*ARGS[0]) % 1000000007'
diff --git a/challenge-079/laurent-rosenfeld/raku/ch-2.raku b/challenge-079/laurent-rosenfeld/raku/ch-2.raku
new file mode 100644
index 0000000000..c7d571f9ee
--- /dev/null
+++ b/challenge-079/laurent-rosenfeld/raku/ch-2.raku
@@ -0,0 +1,32 @@
+use v6;
+
+my @a = @*ARGS.elems > 1 ?? @*ARGS !! (2, 1, 4, 1, 2, 5);
+draw-histo(@a);
+say "Rain capacity is: ", capacity(@a);
+
+
+sub draw-histo (@in) {
+ my $max-val = @in.max;
+ say "";
+ for (1..$max-val).reverse -> $ordinate {
+ print $ordinate;
+ for 0..@in.end -> $i {
+ print @in[$i] >= $ordinate ?? " # " !! " ";
+ }
+ say "";
+ }
+ say " =" x @in.elems;
+ say " ", join " ", @in, "\n";
+}
+
+sub capacity (@in) {
+ my $left-max = @in[0];
+ my $total = 0;
+ for 1..@in.end-1 -> $i {
+ $left-max = @in[$i] and next if @in[$i] > $left-max;
+ my $right-max = max @in[$i+1..@in.end];
+ my $col = min($left-max, $right-max) - @in[$i];
+ $total += $col if $col > 0;
+ }
+ return $total
+}