diff options
Diffstat (limited to 'raku/raindrops')
-rw-r--r-- | raku/raindrops/README.md | 39 | ||||
-rw-r--r-- | raku/raindrops/Raindrops.rakumod | 9 | ||||
-rw-r--r-- | raku/raindrops/raindrops.rakutest | 165 |
3 files changed, 213 insertions, 0 deletions
diff --git a/raku/raindrops/README.md b/raku/raindrops/README.md new file mode 100644 index 0000000..29e6f61 --- /dev/null +++ b/raku/raindrops/README.md @@ -0,0 +1,39 @@ +# Raindrops + +Your task is to convert a number into a string that contains raindrop sounds corresponding to certain potential factors. A factor is a number that evenly divides into another number, leaving no remainder. The simplest way to test if a one number is a factor of another is to use the [modulo operation](https://en.wikipedia.org/wiki/Modulo_operation). + +The rules of `raindrops` are that if a given number: + +- has 3 as a factor, add 'Pling' to the result. +- has 5 as a factor, add 'Plang' to the result. +- has 7 as a factor, add 'Plong' to the result. +- _does not_ have any of 3, 5, or 7 as a factor, the result should be the digits of the number. + +## Examples + +- 28 has 7 as a factor, but not 3 or 5, so the result would be "Plong". +- 30 has both 3 and 5 as factors, but not 7, so the result would be "PlingPlang". +- 34 is not factored by 3, 5, or 7, so the result would be "34". + +## Resources + +Remember to check out the Raku [documentation](https://docs.raku.org/) and +[resources](https://raku.org/resources/) pages for information, tips, and +examples if you get stuck. + +## Running the tests + +There is a test suite and module included with the exercise. +The test suite (a file with the extension `.rakutest`) will attempt to run routines +from the module (a file with the extension `.rakumod`). +Add/modify routines in the module so that the tests will pass! You can view the +test data by executing the command `raku --doc *.rakutest` (\* being the name of the +test suite), and run the test suite for the exercise by executing the command +`prove6 .` in the exercise directory. + +## Source + +A variation on FizzBuzz, a famous technical interview question that is intended to weed out potential candidates. That question is itself derived from Fizz Buzz, a popular children's game for teaching division. [https://en.wikipedia.org/wiki/Fizz_buzz](https://en.wikipedia.org/wiki/Fizz_buzz) + +## Submitting Incomplete Solutions +It's possible to submit an incomplete solution so you can see how others have completed the exercise. diff --git a/raku/raindrops/Raindrops.rakumod b/raku/raindrops/Raindrops.rakumod new file mode 100644 index 0000000..3b41065 --- /dev/null +++ b/raku/raindrops/Raindrops.rakumod @@ -0,0 +1,9 @@ +unit module Raindrops; + +sub raindrop(Int $num --> Str) is export { + my Str $res; + $res ~= "Pling" if $num %% 3; + $res ~= "Plang" if $num %% 5; + $res ~= "Plong" if $num %% 7; + return $res // $num.Str; +} diff --git a/raku/raindrops/raindrops.rakutest b/raku/raindrops/raindrops.rakutest new file mode 100644 index 0000000..a61cfd8 --- /dev/null +++ b/raku/raindrops/raindrops.rakutest @@ -0,0 +1,165 @@ +#!/usr/bin/env raku +use Test; +use JSON::Fast; +use lib $?FILE.IO.dirname; +use Raindrops; +plan 18; + +my @test-cases = from-json($=pod.pop.contents).List; +for @test-cases -> %case { + subtest %case<description>, { + plan 2; + isa-ok ( my $result := raindrop %case<input><number> ), Str; + is $result, %case<expected>, 'Result matches expected'; + } +} + +=head2 Test Cases +=begin code +[ + { + "description": "the sound for 1 is 1", + "expected": "1", + "input": { + "number": 1 + }, + "property": "convert" + }, + { + "description": "the sound for 3 is Pling", + "expected": "Pling", + "input": { + "number": 3 + }, + "property": "convert" + }, + { + "description": "the sound for 5 is Plang", + "expected": "Plang", + "input": { + "number": 5 + }, + "property": "convert" + }, + { + "description": "the sound for 7 is Plong", + "expected": "Plong", + "input": { + "number": 7 + }, + "property": "convert" + }, + { + "description": "the sound for 6 is Pling as it has a factor 3", + "expected": "Pling", + "input": { + "number": 6 + }, + "property": "convert" + }, + { + "description": "2 to the power 3 does not make a raindrop sound as 3 is the exponent not the base", + "expected": "8", + "input": { + "number": 8 + }, + "property": "convert" + }, + { + "description": "the sound for 9 is Pling as it has a factor 3", + "expected": "Pling", + "input": { + "number": 9 + }, + "property": "convert" + }, + { + "description": "the sound for 10 is Plang as it has a factor 5", + "expected": "Plang", + "input": { + "number": 10 + }, + "property": "convert" + }, + { + "description": "the sound for 14 is Plong as it has a factor of 7", + "expected": "Plong", + "input": { + "number": 14 + }, + "property": "convert" + }, + { + "description": "the sound for 15 is PlingPlang as it has factors 3 and 5", + "expected": "PlingPlang", + "input": { + "number": 15 + }, + "property": "convert" + }, + { + "description": "the sound for 21 is PlingPlong as it has factors 3 and 7", + "expected": "PlingPlong", + "input": { + "number": 21 + }, + "property": "convert" + }, + { + "description": "the sound for 25 is Plang as it has a factor 5", + "expected": "Plang", + "input": { + "number": 25 + }, + "property": "convert" + }, + { + "description": "the sound for 27 is Pling as it has a factor 3", + "expected": "Pling", + "input": { + "number": 27 + }, + "property": "convert" + }, + { + "description": "the sound for 35 is PlangPlong as it has factors 5 and 7", + "expected": "PlangPlong", + "input": { + "number": 35 + }, + "property": "convert" + }, + { + "description": "the sound for 49 is Plong as it has a factor 7", + "expected": "Plong", + "input": { + "number": 49 + }, + "property": "convert" + }, + { + "description": "the sound for 52 is 52", + "expected": "52", + "input": { + "number": 52 + }, + "property": "convert" + }, + { + "description": "the sound for 105 is PlingPlangPlong as it has factors 3, 5 and 7", + "expected": "PlingPlangPlong", + "input": { + "number": 105 + }, + "property": "convert" + }, + { + "description": "the sound for 3125 is Plang as it has a factor 5", + "expected": "Plang", + "input": { + "number": 3125 + }, + "property": "convert" + } +] +=end code |