diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-09-29 20:04:25 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-09-29 20:04:25 +0100 |
| commit | 63baf5c0693405f5e3bc3d87a0f523ee712b964c (patch) | |
| tree | d2a32fe8e08522dd460d3a0fcb857d7ed0fdd0cb /challenge-080/mohammad-anwar/raku | |
| parent | 0f50bf1e03970b42514876ebb74e1673a2e9a44b (diff) | |
| download | perlweeklychallenge-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.raku | 8 | ||||
| -rw-r--r-- | challenge-080/mohammad-anwar/raku/ch-1.t | 4 | ||||
| -rw-r--r-- | challenge-080/mohammad-anwar/raku/ch-2.raku | 51 | ||||
| -rw-r--r-- | challenge-080/mohammad-anwar/raku/ch-2.t | 53 |
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; +} |
