summary refs log tree commit diff stats
path: root/raku/raindrops
diff options
context:
space:
mode:
Diffstat (limited to 'raku/raindrops')
-rw-r--r--raku/raindrops/README.md39
-rw-r--r--raku/raindrops/Raindrops.rakumod9
-rw-r--r--raku/raindrops/raindrops.rakutest165
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