aboutsummaryrefslogtreecommitdiff
path: root/challenge-079/mohammad-anwar
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-09-24 18:55:35 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-09-24 18:55:35 +0100
commitbb930973179b42ab7b609191749bfc4ed2b3b5eb (patch)
tree2541b8d569b67ce41336e27d5a80e3a1252e7e4f /challenge-079/mohammad-anwar
parentfd2098ec8154349f6b7eec1143f3c160ea982b08 (diff)
downloadperlweeklychallenge-club-bb930973179b42ab7b609191749bfc4ed2b3b5eb.tar.gz
perlweeklychallenge-club-bb930973179b42ab7b609191749bfc4ed2b3b5eb.tar.bz2
perlweeklychallenge-club-bb930973179b42ab7b609191749bfc4ed2b3b5eb.zip
- Added Raku solution to "Trapped Rain Water" task.
Diffstat (limited to 'challenge-079/mohammad-anwar')
-rw-r--r--challenge-079/mohammad-anwar/raku/ch-2.raku100
-rw-r--r--challenge-079/mohammad-anwar/raku/ch-2.t77
2 files changed, 177 insertions, 0 deletions
diff --git a/challenge-079/mohammad-anwar/raku/ch-2.raku b/challenge-079/mohammad-anwar/raku/ch-2.raku
new file mode 100644
index 0000000000..1376f46827
--- /dev/null
+++ b/challenge-079/mohammad-anwar/raku/ch-2.raku
@@ -0,0 +1,100 @@
+#!/usr/bin/env raku
+
+#
+# Perl Weekly Challenge - 079
+#
+# Task #2: Trapped Rain Water
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-079
+#
+
+use v6.d;
+
+subset PositiveInt of Int where * >= 0;
+
+sub MAIN(*@N where @N.elems > 1 && all(@N) ~~ PositiveInt) {
+ chart(@N).say;
+ trapped-rain-water(@N).say;
+}
+
+#
+#
+# SUBROUTINES
+
+sub trapped-rain-water(*@array where .all ~~ PositiveInt) {
+
+ my @a = ();
+ my $p = 0;
+ my $trw = 0;
+ for @array -> $n {
+ if $p == 0 || $p >= $n {
+ $p = $n if @a == 0 || ($p == 0 && $n > $p);
+ @a.push: $n;
+ }
+ else {
+ @a.push: $n;
+ $trw += fetch-trapped-water(@a);
+ @a = $n;
+ $p = $n if $p < $n;
+ }
+ }
+
+ # are there any left over to be processed?
+ if @a.elems > 1 {
+ $trw += fetch-trapped-water(@a);
+ }
+
+ return $trw;
+}
+
+sub fetch-trapped-water(*@array where .all ~~ PositiveInt) {
+
+ # remove any smaller tower from the start
+ repeat {
+ if @array[0] == 0 {
+ @array.shift;
+ }
+ } until @array[0] > 0;
+
+ # remove any smaller tower from the end
+ repeat {
+ if @array[*-1] < @array[*-2] {
+ @array.pop;
+ }
+ }
+ until @array[*-1] > @array[*-2];
+
+ my $max = (@array[0], @array[*-1]).min * (@array.elems - 2);
+ $max -= @array[$_] for 1..@array.elems - 2;
+
+ return $max;
+}
+
+sub chart(*@list where @list.elems > 1 && all(@list) ~~ PositiveInt --> Str) {
+
+ my $max = @list.max;
+ my $chart = [];
+ my $row = 1;
+ for 1 .. $max -> $n {
+ my Str $data = "";
+ for 0 .. @list.elems-1 -> $i {
+ if $row <= @list[$i] {
+ $data ~= " #";
+ }
+ else {
+ $data ~= " ";
+ }
+ }
+
+ $row += 1;
+
+ $chart.push: sprintf("%d%s", $n, $data);
+ }
+
+ my (Str $histogram, Str $line, Str $size) = ("", "", " ");
+ $histogram = $chart.reverse.join("\n");
+ $line ~= "_ " for 0 .. @list.elems;
+ $size ~= @list.join(" ");
+
+ return ($histogram, $line, $size).join("\n");
+}
diff --git a/challenge-079/mohammad-anwar/raku/ch-2.t b/challenge-079/mohammad-anwar/raku/ch-2.t
new file mode 100644
index 0000000000..cf6d6951a7
--- /dev/null
+++ b/challenge-079/mohammad-anwar/raku/ch-2.t
@@ -0,0 +1,77 @@
+#!/usr/bin/env raku
+
+#
+# Perl Weekly Challenge - 079
+#
+# Task #2: Trapped Rain Water
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-079
+#
+
+use Test;
+
+subset PositiveInt of Int where * >= 0;
+
+is trapped-rain-water(0, 1, 2, 3, 4, 5),
+ 0, "testing: 0, 1, 2, 3, 4, 5";
+is trapped-rain-water(3, 1, 3, 1, 1, 5),
+ 6, "testing: 3, 1, 3, 1, 1, 5";
+is trapped-rain-water(2, 1, 4, 1, 2, 5),
+ 6, "testing: 2, 1, 4, 1, 2, 5";
+is trapped-rain-water(0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1),
+ 6, "testing: 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1";
+
+done-testing;
+
+#
+#
+# SUBROUTINES
+
+sub trapped-rain-water(*@array where .all ~~ PositiveInt) {
+
+ my @a = ();
+ my $p = 0;
+ my $trw = 0;
+ for @array -> $n {
+ if $p == 0 || $p >= $n {
+ $p = $n if @a == 0 || ($p == 0 && $n > $p);
+ @a.push: $n;
+ }
+ else {
+ @a.push: $n;
+ $trw += fetch-trapped-water(@a);
+ @a = $n;
+ $p = $n if $p < $n;
+ }
+ }
+
+ # are there any left over to be processed?
+ if @a.elems > 1 {
+ $trw += fetch-trapped-water(@a);
+ }
+
+ return $trw;
+}
+
+sub fetch-trapped-water(*@array where .all ~~ PositiveInt) {
+
+ # remove any smaller tower from the start
+ repeat {
+ if @array[0] == 0 {
+ @array.shift;
+ }
+ } until @array[0] > 0;
+
+ # remove any smaller tower from the end
+ repeat {
+ if @array[*-1] < @array[*-2] {
+ @array.pop;
+ }
+ }
+ until @array[*-1] > @array[*-2];
+
+ my $max = (@array[0], @array[*-1]).min * (@array.elems - 2);
+ $max -= @array[$_] for 1..@array.elems - 2;
+
+ return $max;
+}