aboutsummaryrefslogtreecommitdiff
path: root/challenge-080/mohammad-anwar/raku
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-09-29 20:04:25 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-09-29 20:04:25 +0100
commit63baf5c0693405f5e3bc3d87a0f523ee712b964c (patch)
treed2a32fe8e08522dd460d3a0fcb857d7ed0fdd0cb /challenge-080/mohammad-anwar/raku
parent0f50bf1e03970b42514876ebb74e1673a2e9a44b (diff)
downloadperlweeklychallenge-club-63baf5c0693405f5e3bc3d87a0f523ee712b964c.tar.gz
perlweeklychallenge-club-63baf5c0693405f5e3bc3d87a0f523ee712b964c.tar.bz2
perlweeklychallenge-club-63baf5c0693405f5e3bc3d87a0f523ee712b964c.zip
- Added Raku solution to the "Count Candies" task.
Diffstat (limited to 'challenge-080/mohammad-anwar/raku')
-rw-r--r--challenge-080/mohammad-anwar/raku/ch-1.raku8
-rw-r--r--challenge-080/mohammad-anwar/raku/ch-1.t4
-rw-r--r--challenge-080/mohammad-anwar/raku/ch-2.raku51
-rw-r--r--challenge-080/mohammad-anwar/raku/ch-2.t53
4 files changed, 112 insertions, 4 deletions
diff --git a/challenge-080/mohammad-anwar/raku/ch-1.raku b/challenge-080/mohammad-anwar/raku/ch-1.raku
index f7c1d02b5a..9eb70e9009 100644
--- a/challenge-080/mohammad-anwar/raku/ch-1.raku
+++ b/challenge-080/mohammad-anwar/raku/ch-1.raku
@@ -14,12 +14,16 @@ sub MAIN(:@N where .all ~~ Int = (2, 3, 7, 6, 8, -1, -10, 15)) {
say smallest-positive-number(@N);
}
-sub smallest-positive-number(@n where .all ~~ Int) {
+#
+#
+# SUBROUTINE
+
+sub smallest-positive-number(@n where .all ~~ Int --> Int) {
my @positive-numbers = @n.sort.grep: { $_ > 0 };
return 1 unless @positive-numbers.elems;
- my $i = 0;
+ my Int $i = 0;
(1 .. @positive-numbers.tail).map: -> $n {
return $n if $n < @positive-numbers[$i++]
};
diff --git a/challenge-080/mohammad-anwar/raku/ch-1.t b/challenge-080/mohammad-anwar/raku/ch-1.t
index 523fac682d..14cde7e58b 100644
--- a/challenge-080/mohammad-anwar/raku/ch-1.t
+++ b/challenge-080/mohammad-anwar/raku/ch-1.t
@@ -34,12 +34,12 @@ done-testing;
#
# SUBROUTINE
-sub smallest-positive-number(@n where .all ~~ Int) {
+sub smallest-positive-number(@n where .all ~~ Int --> Int) {
my @positive-numbers = @n.sort.grep: { $_ > 0 };
return 1 unless @positive-numbers.elems;
- my $i = 0;
+ my Int $i = 0;
(1 .. @positive-numbers.tail).map: -> $n {
return $n if $n < @positive-numbers[$i++]
};
diff --git a/challenge-080/mohammad-anwar/raku/ch-2.raku b/challenge-080/mohammad-anwar/raku/ch-2.raku
new file mode 100644
index 0000000000..9602f1379e
--- /dev/null
+++ b/challenge-080/mohammad-anwar/raku/ch-2.raku
@@ -0,0 +1,51 @@
+#!/usr/bin/env raku
+
+#
+# Perl Weekly Challenge - 080
+#
+# Task #2: Count Candies
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-080
+#
+
+use v6.d;
+
+subset PositiveInt of Int where * > 0;
+
+sub MAIN(*@N where @N.elems > 1 && all(@N) ~~ PositiveInt) {
+ say "Total candies: " ~ count-candies(@N);
+}
+
+#
+#
+# SUBROUTINE
+
+sub count-candies(@rankings
+ where @rankings.elems > 1 &&
+ all(@rankings) ~~ PositiveInt --> Int) {
+
+ my @l2r = Empty;
+ my @r2l = Empty;
+
+ @l2r.push: 1 for @rankings;
+ @r2l.push: 1 for @rankings;
+
+ my Int $i = 1;
+ while $i < @rankings.elems {
+ @l2r[$i] = @l2r[$i - 1] + 1
+ if @rankings[$i] > @rankings[$i - 1];
+ $i++;
+ }
+
+ my Int $j = @rankings.elems - 2;
+ while $j >= 0 {
+ @r2l[$j] = @r2l[$j + 1] + 1
+ if @rankings[$j] > @rankings[$j + 1];
+ $j--;
+ }
+
+ my Int $count = 0;
+ $count += (@l2r[$_], @r2l[$_]).max for 0 .. @rankings.elems - 1;
+
+ return $count;
+}
diff --git a/challenge-080/mohammad-anwar/raku/ch-2.t b/challenge-080/mohammad-anwar/raku/ch-2.t
new file mode 100644
index 0000000000..30ca48cfe8
--- /dev/null
+++ b/challenge-080/mohammad-anwar/raku/ch-2.t
@@ -0,0 +1,53 @@
+#!/usr/bin/env raku
+
+#
+# Perl Weekly Challenge - 080
+#
+# Task #2: Count Candies
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-080
+#
+
+use Test;
+
+subset PositiveInt of Int where * > 0;
+
+is count-candies((1, 2)), 3, "testing: (1, 2)";
+is count-candies((1, 2, 2)), 4, "testing: (1, 2, 2)";
+is count-candies((1, 5, 2, 1)), 7, "testing: (1, 5, 2, 1)";
+
+done-testing;
+
+#
+#
+# SUBROUTINE
+
+sub count-candies(@rankings
+ where @rankings.elems > 1 &&
+ all(@rankings) ~~ PositiveInt --> Int) {
+
+ my @l2r = Empty;
+ my @r2l = Empty;
+
+ @l2r.push: 1 for @rankings;
+ @r2l.push: 1 for @rankings;
+
+ my Int $i = 1;
+ while $i < @rankings.elems {
+ @l2r[$i] = @l2r[$i - 1] + 1
+ if @rankings[$i] > @rankings[$i - 1];
+ $i++;
+ }
+
+ my Int $j = @rankings.elems - 2;
+ while $j >= 0 {
+ @r2l[$j] = @r2l[$j + 1] + 1
+ if @rankings[$j] > @rankings[$j + 1];
+ $j--;
+ }
+
+ my Int $count = 0;
+ $count += (@l2r[$_], @r2l[$_]).max for 0 .. @rankings.elems - 1;
+
+ return $count;
+}