From 321825828ac918bad28d0597a8616c6dc9802c3c Mon Sep 17 00:00:00 2001 From: Andinus Date: Wed, 11 Aug 2021 15:26:15 +0530 Subject: Add solved exercises --- python/hello-world/README.md | 62 +++++++++++++++++++++++++++++ python/hello-world/hello_world.py | 2 + python/hello-world/hello_world_test.py | 14 +++++++ python/raindrops/README.md | 63 +++++++++++++++++++++++++++++ python/raindrops/raindrops.py | 11 ++++++ python/raindrops/raindrops_test.py | 67 +++++++++++++++++++++++++++++++ python/two-fer/README.md | 72 ++++++++++++++++++++++++++++++++++ python/two-fer/two_fer.py | 2 + python/two-fer/two_fer_test.py | 20 ++++++++++ 9 files changed, 313 insertions(+) create mode 100644 python/hello-world/README.md create mode 100644 python/hello-world/hello_world.py create mode 100644 python/hello-world/hello_world_test.py create mode 100644 python/raindrops/README.md create mode 100644 python/raindrops/raindrops.py create mode 100644 python/raindrops/raindrops_test.py create mode 100644 python/two-fer/README.md create mode 100644 python/two-fer/two_fer.py create mode 100644 python/two-fer/two_fer_test.py (limited to 'python') diff --git a/python/hello-world/README.md b/python/hello-world/README.md new file mode 100644 index 0000000..d5acfab --- /dev/null +++ b/python/hello-world/README.md @@ -0,0 +1,62 @@ +# Hello World + +The classical introductory exercise. Just say "Hello, World!". + +["Hello, World!"](http://en.wikipedia.org/wiki/%22Hello,_world!%22_program) is +the traditional first program for beginning programming in a new language +or environment. + +The objectives are simple: + +- Write a function that returns the string "Hello, World!". +- Run the test suite and make sure that it succeeds. +- Submit your solution and check it at the website. + +If everything goes well, you will be ready to fetch your first real exercise. + + +## Exception messages + +Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to +indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not +every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include +a message. + +To raise a message with an exception, just write it as an argument to the exception type. For example, instead of +`raise Exception`, you should write: + +```python +raise Exception("Meaningful message indicating the source of the error") +``` + +## Running the tests + +To run the tests, run `pytest hello_world_test.py` + +Alternatively, you can tell Python to run the pytest module: +`python -m pytest hello_world_test.py` + +### Common `pytest` options + +- `-v` : enable verbose output +- `-x` : stop running tests on first failure +- `--ff` : run failures from previous test before running other test cases + +For other options, see `python -m pytest -h` + +## Submitting Exercises + +Note that, when trying to submit an exercise, make sure the solution is in the `$EXERCISM_WORKSPACE/python/hello-world` directory. + +You can find your Exercism workspace by running `exercism debug` and looking for the line that starts with `Workspace`. + +For more detailed information about running tests, code style and linting, +please see [Running the Tests](http://exercism.io/tracks/python/tests). + +## Source + +This is an exercise to introduce users to using Exercism [http://en.wikipedia.org/wiki/%22Hello,_world!%22_program](http://en.wikipedia.org/wiki/%22Hello,_world!%22_program) + +## Submitting Incomplete Solutions + +It's possible to submit an incomplete solution so you can see how others have completed the exercise. diff --git a/python/hello-world/hello_world.py b/python/hello-world/hello_world.py new file mode 100644 index 0000000..dea05ae --- /dev/null +++ b/python/hello-world/hello_world.py @@ -0,0 +1,2 @@ +def hello(): + return "Hello, World!" diff --git a/python/hello-world/hello_world_test.py b/python/hello-world/hello_world_test.py new file mode 100644 index 0000000..82dc88e --- /dev/null +++ b/python/hello-world/hello_world_test.py @@ -0,0 +1,14 @@ +import unittest + +from hello_world import hello + +# Tests adapted from `problem-specifications//canonical-data.json` + + +class HelloWorldTest(unittest.TestCase): + def test_say_hi(self): + self.assertEqual(hello(), "Hello, World!") + + +if __name__ == "__main__": + unittest.main() diff --git a/python/raindrops/README.md b/python/raindrops/README.md new file mode 100644 index 0000000..acfac81 --- /dev/null +++ b/python/raindrops/README.md @@ -0,0 +1,63 @@ +# 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". + + +## Exception messages + +Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to +indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not +every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include +a message. + +To raise a message with an exception, just write it as an argument to the exception type. For example, instead of +`raise Exception`, you should write: + +```python +raise Exception("Meaningful message indicating the source of the error") +``` + +## Running the tests + +To run the tests, run `pytest raindrops_test.py` + +Alternatively, you can tell Python to run the pytest module: +`python -m pytest raindrops_test.py` + +### Common `pytest` options + +- `-v` : enable verbose output +- `-x` : stop running tests on first failure +- `--ff` : run failures from previous test before running other test cases + +For other options, see `python -m pytest -h` + +## Submitting Exercises + +Note that, when trying to submit an exercise, make sure the solution is in the `$EXERCISM_WORKSPACE/python/raindrops` directory. + +You can find your Exercism workspace by running `exercism debug` and looking for the line that starts with `Workspace`. + +For more detailed information about running tests, code style and linting, +please see [Running the Tests](http://exercism.io/tracks/python/tests). + +## 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/python/raindrops/raindrops.py b/python/raindrops/raindrops.py new file mode 100644 index 0000000..f1cee2e --- /dev/null +++ b/python/raindrops/raindrops.py @@ -0,0 +1,11 @@ +def convert(number): + result = "" + if number % 3 == 0: + result += "Pling" + if number % 5 == 0: + result += "Plang" + if number % 7 == 0: + result += "Plong" + if len(result) == 0: + result = str(number) + return result diff --git a/python/raindrops/raindrops_test.py b/python/raindrops/raindrops_test.py new file mode 100644 index 0000000..8ac1a43 --- /dev/null +++ b/python/raindrops/raindrops_test.py @@ -0,0 +1,67 @@ +import unittest + +from raindrops import convert + +# Tests adapted from `problem-specifications//canonical-data.json` + + +class RaindropsTest(unittest.TestCase): + def test_the_sound_for_1_is_1(self): + self.assertEqual(convert(1), "1") + + def test_the_sound_for_3_is_pling(self): + self.assertEqual(convert(3), "Pling") + + def test_the_sound_for_5_is_plang(self): + self.assertEqual(convert(5), "Plang") + + def test_the_sound_for_7_is_plong(self): + self.assertEqual(convert(7), "Plong") + + def test_the_sound_for_6_is_pling_as_it_has_a_factor_3(self): + self.assertEqual(convert(6), "Pling") + + def test_2_to_the_power_3_does_not_make_a_raindrop_sound_as_3_is_the_exponent_not_the_base( + self + ): + self.assertEqual(convert(8), "8") + + def test_the_sound_for_9_is_pling_as_it_has_a_factor_3(self): + self.assertEqual(convert(9), "Pling") + + def test_the_sound_for_10_is_plang_as_it_has_a_factor_5(self): + self.assertEqual(convert(10), "Plang") + + def test_the_sound_for_14_is_plong_as_it_has_a_factor_of_7(self): + self.assertEqual(convert(14), "Plong") + + def test_the_sound_for_15_is_pling_plang_as_it_has_factors_3_and_5(self): + self.assertEqual(convert(15), "PlingPlang") + + def test_the_sound_for_21_is_pling_plong_as_it_has_factors_3_and_7(self): + self.assertEqual(convert(21), "PlingPlong") + + def test_the_sound_for_25_is_plang_as_it_has_a_factor_5(self): + self.assertEqual(convert(25), "Plang") + + def test_the_sound_for_27_is_pling_as_it_has_a_factor_3(self): + self.assertEqual(convert(27), "Pling") + + def test_the_sound_for_35_is_plang_plong_as_it_has_factors_5_and_7(self): + self.assertEqual(convert(35), "PlangPlong") + + def test_the_sound_for_49_is_plong_as_it_has_a_factor_7(self): + self.assertEqual(convert(49), "Plong") + + def test_the_sound_for_52_is_52(self): + self.assertEqual(convert(52), "52") + + def test_the_sound_for_105_is_pling_plang_plong_as_it_has_factors_3_5_and_7(self): + self.assertEqual(convert(105), "PlingPlangPlong") + + def test_the_sound_for_3125_is_plang_as_it_has_a_factor_5(self): + self.assertEqual(convert(3125), "Plang") + + +if __name__ == "__main__": + unittest.main() diff --git a/python/two-fer/README.md b/python/two-fer/README.md new file mode 100644 index 0000000..5528964 --- /dev/null +++ b/python/two-fer/README.md @@ -0,0 +1,72 @@ +# Two Fer + +`Two-fer` or `2-fer` is short for two for one. One for you and one for me. + +Given a name, return a string with the message: + +```text +One for X, one for me. +``` + +Where X is the given name. + +However, if the name is missing, return the string: + +```text +One for you, one for me. +``` + +Here are some examples: + +|Name |String to return +|:-------|:------------------ +|Alice |One for Alice, one for me. +|Bob |One for Bob, one for me. +| |One for you, one for me. +|Zaphod |One for Zaphod, one for me. + +## Exception messages + +Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to +indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not +every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include +a message. + +To raise a message with an exception, just write it as an argument to the exception type. For example, instead of +`raise Exception`, you should write: + +```python +raise Exception("Meaningful message indicating the source of the error") +``` + +## Running the tests + +To run the tests, run `pytest two_fer_test.py` + +Alternatively, you can tell Python to run the pytest module: +`python -m pytest two_fer_test.py` + +### Common `pytest` options + +- `-v` : enable verbose output +- `-x` : stop running tests on first failure +- `--ff` : run failures from previous test before running other test cases + +For other options, see `python -m pytest -h` + +## Submitting Exercises + +Note that, when trying to submit an exercise, make sure the solution is in the `$EXERCISM_WORKSPACE/python/two-fer` directory. + +You can find your Exercism workspace by running `exercism debug` and looking for the line that starts with `Workspace`. + +For more detailed information about running tests, code style and linting, +please see [Running the Tests](http://exercism.io/tracks/python/tests). + +## Source + +[https://github.com/exercism/problem-specifications/issues/757](https://github.com/exercism/problem-specifications/issues/757) + +## Submitting Incomplete Solutions + +It's possible to submit an incomplete solution so you can see how others have completed the exercise. diff --git a/python/two-fer/two_fer.py b/python/two-fer/two_fer.py new file mode 100644 index 0000000..c49fbce --- /dev/null +++ b/python/two-fer/two_fer.py @@ -0,0 +1,2 @@ +def two_fer(name = "you"): + return "One for {0}, one for me.".format(name) diff --git a/python/two-fer/two_fer_test.py b/python/two-fer/two_fer_test.py new file mode 100644 index 0000000..90a2f93 --- /dev/null +++ b/python/two-fer/two_fer_test.py @@ -0,0 +1,20 @@ +import unittest + +from two_fer import two_fer + +# Tests adapted from `problem-specifications//canonical-data.json` + + +class TwoFerTest(unittest.TestCase): + def test_no_name_given(self): + self.assertEqual(two_fer(), "One for you, one for me.") + + def test_a_name_given(self): + self.assertEqual(two_fer("Alice"), "One for Alice, one for me.") + + def test_another_name_given(self): + self.assertEqual(two_fer("Bob"), "One for Bob, one for me.") + + +if __name__ == "__main__": + unittest.main() -- cgit 1.4.1-2-gfad0