# shmibs's solution

## to Raindrops in the OCaml Track

Published at Dec 08 2018 · 0 comments
Instructions
Test suite
Solution

#### Note:

This exercise has changed since this solution was written.

Convert a number to a string, the contents of which depend on the number's factors.

• If the number has 3 as a factor, output 'Pling'.
• If the number has 5 as a factor, output 'Plang'.
• If the number has 7 as a factor, output 'Plong'.
• If the number does not have 3, 5, or 7 as a factor, just pass the number's digits straight through.

## Examples

• 28's factors are 1, 2, 4, 7, 14, 28.
• In raindrop-speak, this would be a simple "Plong".
• 30's factors are 1, 2, 3, 5, 6, 10, 15, 30.
• In raindrop-speak, this would be a "PlingPlang".
• 34 has four factors: 1, 2, 17, and 34.
• In raindrop-speak, this would be "34".

## Getting Started

For installation and learning resources, refer to the exercism help page.

## Installation

To work on the exercises, you will need `Opam` and `Base`. Consult opam website for instructions on how to install `opam` for your OS. Once `opam` is installed open a terminal window and run the following command to install base:

``````opam install base
``````

To run the tests you will need `OUnit`. Install it using `opam`:

``````opam install ounit
``````

## Running Tests

A Makefile is provided with a default target to compile your solution and run the tests. At the command line, type:

``````make
``````

## Interactive Shell

`utop` is a command line program which allows you to run Ocaml code interactively. The easiest way to install it is via opam:

``````opam install utop
``````

Consult utop for more detail.

## Feedback, Issues, Pull Requests

The exercism/ocaml repository on GitHub is the home for all of the Ocaml exercises.

If you have feedback about an exercise, or want to help implementing a new one, head over there and create an issue. We'll do our best to help you!

## Source

A variation on a famous interview question intended to weed out potential candidates. http://jumpstartlab.com

## Submitting Incomplete Solutions

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

### test.ml

``````open OUnit2
open Raindrops

let ae exp got _test_ctxt = assert_equal ~printer:(fun x -> x) exp got

let tests = [
"the sound for 1 is 1" >::
ae "1" (raindrop 1);
"the sound for 3 is Pling" >::
ae "Pling" (raindrop 3);
"the sound for 5 is Plang" >::
ae "Plang" (raindrop 5);
"the sound for 7 is Plong" >::
ae "Plong" (raindrop 7);
"the sound for 6 is Pling as it has a factor 3" >::
ae "Pling" (raindrop 6);
"2 to the power 3 does not make a raindrop sound as 3 is the exponent not the base" >::
ae "8" (raindrop 8);
"the sound for 9 is Pling as it has a factor 3" >::
ae "Pling" (raindrop 9);
"the sound for 10 is Plang as it has a factor 5" >::
ae "Plang" (raindrop 10);
"the sound for 14 is Plong as it has a factor of 7" >::
ae "Plong" (raindrop 14);
"the sound for 15 is PlingPlang as it has factors 3 and 5" >::
ae "PlingPlang" (raindrop 15);
"the sound for 21 is PlingPlong as it has factors 3 and 7" >::
ae "PlingPlong" (raindrop 21);
"the sound for 25 is Plang as it has a factor 5" >::
ae "Plang" (raindrop 25);
"the sound for 27 is Pling as it has a factor 3" >::
ae "Pling" (raindrop 27);
"the sound for 35 is PlangPlong as it has factors 5 and 7" >::
ae "PlangPlong" (raindrop 35);
"the sound for 49 is Plong as it has a factor 7" >::
ae "Plong" (raindrop 49);
"the sound for 52 is 52" >::
ae "52" (raindrop 52);
"the sound for 105 is PlingPlangPlong as it has factors 3, 5 and 7" >::
ae "PlingPlangPlong" (raindrop 105);
"the sound for 3125 is Plang as it has a factor 5" >::
ae "Plang" (raindrop 3125);
]

let () =
run_test_tt_main ("raindrops tests" >::: tests)``````
``````open Core

let wordmap = [3, "Pling"; 5, "Plang"; 7, "Plong"]

let raindrop (i : int) =
wordmap
|> List.map ~f:(fun (k, v) -> if Int.rem i k = 0 then v else "")
|> String.concat
|> fun s -> if s = "" then (Int.to_string i) else s``````