diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-09-24 18:55:35 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-09-24 18:55:35 +0100 |
| commit | bb930973179b42ab7b609191749bfc4ed2b3b5eb (patch) | |
| tree | 2541b8d569b67ce41336e27d5a80e3a1252e7e4f /challenge-079/mohammad-anwar | |
| parent | fd2098ec8154349f6b7eec1143f3c160ea982b08 (diff) | |
| download | perlweeklychallenge-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.raku | 100 | ||||
| -rw-r--r-- | challenge-079/mohammad-anwar/raku/ch-2.t | 77 |
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; +} |
