ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# dominix's solution

## to Raindrops in the Raku Track

Published at Feb 10 2021 · 0 comments
Instructions
Test suite
Solution

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.

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 and 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

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### raindrops.rakutest

``````#!/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';
}
}

=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``````
``````unit module Raindrops;

sub raindrop (\$num) is export {

my \$res ="";
\$res ~= "Pling" if \$num %% 3;
\$res ~= "Plang" if \$num %% 5;
\$res ~= "Plong" if \$num %% 7;
\$res ~= \$num.Str if \$res eq "";
\$res;
}``````