Jim Infield
3 years ago
commit
dd9f32c3bc
4 changed files with 200 additions and 0 deletions
@ -0,0 +1 @@ |
|||||
|
{"track":"bash","exercise":"raindrops","id":"7f497d15e3ac43dd82a89e80571d8dd4","url":"https://exercism.io/my/solutions/7f497d15e3ac43dd82a89e80571d8dd4","handle":"jinfield","is_requester":true,"auto_approve":false} |
@ -0,0 +1,62 @@ |
|||||
|
# 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". |
||||
|
|
||||
|
|
||||
|
Run the tests with: |
||||
|
|
||||
|
```bash |
||||
|
bats raindrops_test.sh |
||||
|
``` |
||||
|
|
||||
|
After the first test(s) pass, continue by commenting out or removing the |
||||
|
`[[ $BATS_RUN_SKIPPED == true ]] || skip` |
||||
|
annotations prepending other tests. |
||||
|
|
||||
|
To run all tests, including the ones with `skip` annotations, run: |
||||
|
|
||||
|
```bash |
||||
|
BATS_RUN_SKIPPED=true bats raindrops_test.sh |
||||
|
``` |
||||
|
|
||||
|
## 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) |
||||
|
|
||||
|
|
||||
|
## External utilities |
||||
|
`Bash` is a language to write "scripts" -- programs that can call |
||||
|
external tools, such as |
||||
|
[`sed`](https://www.gnu.org/software/sed/), |
||||
|
[`awk`](https://www.gnu.org/software/gawk/), |
||||
|
[`date`](https://www.gnu.org/software/coreutils/manual/html_node/date-invocation.html) |
||||
|
and even programs written in other programming languages, |
||||
|
like [`Python`](https://www.python.org/). |
||||
|
This track does not restrict the usage of these utilities, and as long |
||||
|
as your solution is portable between systems and does not require |
||||
|
installation of third party applications, feel free to use them to solve |
||||
|
the exercise. |
||||
|
|
||||
|
For an extra challenge, if you would like to have a better understanding |
||||
|
of the language, try to re-implement the solution in pure `Bash`, |
||||
|
without using any external tools. Note that there are some types of |
||||
|
problems that bash cannot solve, such as performing floating point |
||||
|
arithmetic and manipulating dates: for those, you must call out to an |
||||
|
external tool. |
||||
|
|
||||
|
## Submitting Incomplete Solutions |
||||
|
It's possible to submit an incomplete solution so you can see how others |
||||
|
have completed the exercise. |
@ -0,0 +1,8 @@ |
|||||
|
#!/usr/bin/env bash |
||||
|
|
||||
|
[[ -z $1 || ! $1 =~ ^[0-9]+$ ]] && echo "Usage: $0 <number>" && exit 1 |
||||
|
[[ $(( $1%7 )) = 0 ]] && res+="Pling" |
||||
|
[[ $(( $1%5 )) = 0 ]] && res+="Plang" |
||||
|
[[ $(( $1%3 )) = 0 ]] && res+="Plong" |
||||
|
[[ -z $res ]] && res=$1 |
||||
|
echo $res |
@ -0,0 +1,129 @@ |
|||||
|
#!/usr/bin/env bash |
||||
|
|
||||
|
# local version: 1.1.0.0 |
||||
|
|
||||
|
@test "the sound for 1 is 1" { |
||||
|
#[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 1 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "1" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 3 is Pling" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 3 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Pling" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 5 is Plang" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 5 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Plang" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 7 is Plong" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 7 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Plong" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 6 is Pling as it has a factor 3" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 6 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Pling" ]] |
||||
|
} |
||||
|
|
||||
|
@test "2 to the power 3 does not make a raindrop sound as 3 is the exponent not the base" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 8 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "8" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 9 is Pling as it has a factor 3" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 9 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Pling" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 10 is Plang as it has a factor 5" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 10 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Plang" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 14 is Plong as it has a factor of 7" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 14 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Plong" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 15 is PlingPlang as it has factors 3 and 5" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 15 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "PlingPlang" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 21 is PlingPlong as it has factors 3 and 7" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 21 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "PlingPlong" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 25 is Plang as it has a factor 5" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 25 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Plang" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 27 is Pling as it has a factor 3" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 27 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Pling" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 35 is PlangPlong as it has factors 5 and 7" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 35 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "PlangPlong" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 49 is Plong as it has a factor 7" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 49 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Plong" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 52 is 52" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 52 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "52" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 105 is PlingPlangPlong as it has factors 3, 5 and 7" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 105 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "PlingPlangPlong" ]] |
||||
|
} |
||||
|
|
||||
|
@test "the sound for 3125 is Plang as it has a factor 5" { |
||||
|
[[ $BATS_RUN_SKIPPED == "true" ]] || skip |
||||
|
run bash raindrops.sh 3125 |
||||
|
(( status == 0 )) |
||||
|
[[ $output == "Plang" ]] |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue