primeiro commit com exercicios de Exercism realizados até esta data
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"authors": [
|
||||
"sjakobi"
|
||||
],
|
||||
"contributors": [
|
||||
"ackerleytng",
|
||||
"behrtam",
|
||||
"bsoyka",
|
||||
"cmccandless",
|
||||
"Dog",
|
||||
"etmoore",
|
||||
"GascaK",
|
||||
"ikhadykin",
|
||||
"julianandrews",
|
||||
"kotp",
|
||||
"kytrinyx",
|
||||
"lekum",
|
||||
"N-Parsons",
|
||||
"pheanex",
|
||||
"tqa236"
|
||||
],
|
||||
"files": {
|
||||
"solution": [
|
||||
"sum_of_multiples.py"
|
||||
],
|
||||
"test": [
|
||||
"sum_of_multiples_test.py"
|
||||
],
|
||||
"example": [
|
||||
".meta/example.py"
|
||||
]
|
||||
},
|
||||
"blurb": "Given a number, find the sum of all the multiples of particular numbers up to but not including that number.",
|
||||
"source": "A variation on Problem 1 at Project Euler",
|
||||
"source_url": "https://projecteuler.net/problem=1"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"track":"python","exercise":"sum-of-multiples","id":"391288cf3f374490a713bc5193562262","url":"https://exercism.org/tracks/python/exercises/sum-of-multiples","handle":"sanctushck","is_requester":true,"auto_approve":false}
|
||||
@@ -0,0 +1,130 @@
|
||||
# Help
|
||||
|
||||
## Running the tests
|
||||
|
||||
We use [pytest][pytest: Getting Started Guide] as our website test runner.
|
||||
You will need to install `pytest` on your development machine if you want to run tests for the Python track locally.
|
||||
You should also install the following `pytest` plugins:
|
||||
|
||||
- [pytest-cache][pytest-cache]
|
||||
- [pytest-subtests][pytest-subtests]
|
||||
|
||||
Extended information can be found in our website [Python testing guide][Python track tests page].
|
||||
|
||||
|
||||
### Running Tests
|
||||
|
||||
To run the included tests, navigate to the folder where the exercise is stored using `cd` in your terminal (_replace `{exercise-folder-location}` below with your path_).
|
||||
Test files usually end in `_test.py`, and are the same tests that run on the website when a solution is uploaded.
|
||||
|
||||
Linux/MacOS
|
||||
```bash
|
||||
$ cd {path/to/exercise-folder-location}
|
||||
```
|
||||
|
||||
Windows
|
||||
```powershell
|
||||
PS C:\Users\foobar> cd {path\to\exercise-folder-location}
|
||||
```
|
||||
|
||||
<br>
|
||||
|
||||
Next, run the `pytest` command in your terminal, replacing `{exercise_test.py}` with the name of the test file:
|
||||
|
||||
Linux/MacOS
|
||||
```bash
|
||||
$ python3 -m pytest -o markers=task {exercise_test.py}
|
||||
==================== 7 passed in 0.08s ====================
|
||||
```
|
||||
|
||||
Windows
|
||||
```powershell
|
||||
PS C:\Users\foobar> py -m pytest -o markers=task {exercise_test.py}
|
||||
==================== 7 passed in 0.08s ====================
|
||||
```
|
||||
|
||||
|
||||
### Common options
|
||||
- `-o` : override default `pytest.ini` (_you can use this to avoid marker warnings_)
|
||||
- `-v` : enable verbose output.
|
||||
- `-x` : stop running tests on first failure.
|
||||
- `--ff` : run failures from previous test before running other test cases.
|
||||
|
||||
For additional options, use `python3 -m pytest -h` or `py -m pytest -h`.
|
||||
|
||||
|
||||
### Fixing warnings
|
||||
|
||||
If you do not use `pytest -o markers=task` when invoking `pytest`, you might receive a `PytestUnknownMarkWarning` for tests that use our new syntax:
|
||||
|
||||
```bash
|
||||
PytestUnknownMarkWarning: Unknown pytest.mark.task - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
|
||||
```
|
||||
|
||||
To avoid typing `pytest -o markers=task` for every test you run, you can use a `pytest.ini` configuration file.
|
||||
We have made one that can be downloaded from the top level of the Python track directory: [pytest.ini][pytest.ini].
|
||||
|
||||
You can also create your own `pytest.ini` file with the following content:
|
||||
|
||||
```ini
|
||||
[pytest]
|
||||
markers =
|
||||
task: A concept exercise task.
|
||||
```
|
||||
|
||||
Placing the `pytest.ini` file in the _root_ or _working_ directory for your Python track exercises will register the marks and stop the warnings.
|
||||
More information on pytest marks can be found in the `pytest` documentation on [marking test functions][pytest: marking test functions with attributes] and the `pytest` documentation on [working with custom markers][pytest: working with custom markers].
|
||||
|
||||
Information on customizing pytest configurations can be found in the `pytest` documentation on [configuration file formats][pytest: configuration file formats].
|
||||
|
||||
|
||||
### Extending your IDE or Code Editor
|
||||
|
||||
Many IDEs and code editors have built-in support for using `pytest` and other code quality tools.
|
||||
Some community-sourced options can be found on our [Python track tools page][Python track tools page].
|
||||
|
||||
[Pytest: Getting Started Guide]: https://docs.pytest.org/en/latest/getting-started.html
|
||||
[Python track tools page]: https://exercism.org/docs/tracks/python/tools
|
||||
[Python track tests page]: https://exercism.org/docs/tracks/python/tests
|
||||
[pytest-cache]:http://pythonhosted.org/pytest-cache/
|
||||
[pytest-subtests]:https://github.com/pytest-dev/pytest-subtests
|
||||
[pytest.ini]: https://github.com/exercism/python/blob/main/pytest.ini
|
||||
[pytest: configuration file formats]: https://docs.pytest.org/en/6.2.x/customize.html#configuration-file-formats
|
||||
[pytest: marking test functions with attributes]: https://docs.pytest.org/en/6.2.x/mark.html#raising-errors-on-unknown-marks
|
||||
[pytest: working with custom markers]: https://docs.pytest.org/en/6.2.x/example/markers.html#working-with-custom-markers
|
||||
|
||||
## Submitting your solution
|
||||
|
||||
You can submit your solution using the `exercism submit sum_of_multiples.py` command.
|
||||
This command will upload your solution to the Exercism website and print the solution page's URL.
|
||||
|
||||
It's possible to submit an incomplete solution which allows you to:
|
||||
|
||||
- See how others have completed the exercise
|
||||
- Request help from a mentor
|
||||
|
||||
## Need to get help?
|
||||
|
||||
If you'd like help solving the exercise, check the following pages:
|
||||
|
||||
- The [Python track's documentation](https://exercism.org/docs/tracks/python)
|
||||
- The [Python track's programming category on the forum](https://forum.exercism.org/c/programming/python)
|
||||
- [Exercism's programming category on the forum](https://forum.exercism.org/c/programming/5)
|
||||
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
|
||||
|
||||
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
|
||||
|
||||
Below are some resources for getting help if you run into trouble:
|
||||
|
||||
- [The PSF](https://www.python.org) hosts Python downloads, documentation, and community resources.
|
||||
- [The Exercism Community on Discord](https://exercism.org/r/discord)
|
||||
- [Python Community on Discord](https://pythondiscord.com/) is a very helpful and active community.
|
||||
- [/r/learnpython/](https://www.reddit.com/r/learnpython/) is a subreddit designed for Python learners.
|
||||
- [#python on Libera.chat](https://www.python.org/community/irc/) this is where the core developers for the language hang out and get work done.
|
||||
- [Python Community Forums](https://discuss.python.org/)
|
||||
- [Free Code Camp Community Forums](https://forum.freecodecamp.org/)
|
||||
- [CodeNewbie Community Help Tag](https://community.codenewbie.org/t/help)
|
||||
- [Pythontutor](http://pythontutor.com/) for stepping through small code snippets visually.
|
||||
|
||||
Additionally, [StackOverflow](http://stackoverflow.com/questions/tagged/python) is a good spot to search for your problem/question to see if it has been answered already.
|
||||
If not - you can always [ask](https://stackoverflow.com/help/how-to-ask) or [answer](https://stackoverflow.com/help/how-to-answer) someone else's question.
|
||||
@@ -0,0 +1,74 @@
|
||||
# Sum of Multiples
|
||||
|
||||
Welcome to Sum of Multiples on Exercism's Python Track.
|
||||
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||
|
||||
## Introduction
|
||||
|
||||
You work for a company that makes an online, fantasy-survival game.
|
||||
|
||||
When a player finishes a level, they are awarded energy points.
|
||||
The amount of energy awarded depends on which magical items the player found while exploring that level.
|
||||
|
||||
## Instructions
|
||||
|
||||
Your task is to write the code that calculates the energy points that get awarded to players when they complete a level.
|
||||
|
||||
The points awarded depend on two things:
|
||||
|
||||
- The level (a number) that the player completed.
|
||||
- The base value of each magical item collected by the player during that level.
|
||||
|
||||
The energy points are awarded according to the following rules:
|
||||
|
||||
1. For each magical item, take the base value and find all the multiples of that value that are less than the level number.
|
||||
2. Combine the sets of numbers.
|
||||
3. Remove any duplicates.
|
||||
4. Calculate the sum of all the numbers that are left.
|
||||
|
||||
Let's look at an example:
|
||||
|
||||
**The player completed level 20 and found two magical items with base values of 3 and 5.**
|
||||
|
||||
To calculate the energy points earned by the player, we need to find all the unique multiples of these base values that are less than level 20.
|
||||
|
||||
- Multiples of 3 less than 20: `{3, 6, 9, 12, 15, 18}`
|
||||
- Multiples of 5 less than 20: `{5, 10, 15}`
|
||||
- Combine the sets and remove duplicates: `{3, 5, 6, 9, 10, 12, 15, 18}`
|
||||
- Sum the unique multiples: `3 + 5 + 6 + 9 + 10 + 12 + 15 + 18 = 78`
|
||||
- Therefore, the player earns **78** energy points for completing level 20 and finding the two magical items with base values of 3 and 5.
|
||||
|
||||
You can make the following assumptions about the inputs to the
|
||||
`sum_of_multiples` function:
|
||||
* All input numbers are non-negative `int`s, i.e. natural numbers
|
||||
including zero.
|
||||
* A list of factors must be given, and its elements are unique
|
||||
and sorted in ascending order.
|
||||
|
||||
## Source
|
||||
|
||||
### Created by
|
||||
|
||||
- @sjakobi
|
||||
|
||||
### Contributed to by
|
||||
|
||||
- @ackerleytng
|
||||
- @behrtam
|
||||
- @bsoyka
|
||||
- @cmccandless
|
||||
- @Dog
|
||||
- @etmoore
|
||||
- @GascaK
|
||||
- @ikhadykin
|
||||
- @julianandrews
|
||||
- @kotp
|
||||
- @kytrinyx
|
||||
- @lekum
|
||||
- @N-Parsons
|
||||
- @pheanex
|
||||
- @tqa236
|
||||
|
||||
### Based on
|
||||
|
||||
A variation on Problem 1 at Project Euler - https://projecteuler.net/problem=1
|
||||
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -0,0 +1,14 @@
|
||||
def sum_of_multiples(limit: int, multiples: list) -> int:
|
||||
set_of_multiples: set = set()
|
||||
sum: int = 0
|
||||
# search which level is multiple of 'multiple' and add them to the set
|
||||
for factor in multiples:
|
||||
for level in range(limit):
|
||||
if factor == 0:
|
||||
continue
|
||||
if level % factor == 0:
|
||||
set_of_multiples.add(level)
|
||||
# sum the items on the set
|
||||
for item in set_of_multiples:
|
||||
sum += item
|
||||
return sum
|
||||
@@ -0,0 +1,61 @@
|
||||
# These tests are auto-generated with test data from:
|
||||
# https://github.com/exercism/problem-specifications/tree/main/exercises/sum-of-multiples/canonical-data.json
|
||||
# File last updated on 2023-07-19
|
||||
|
||||
import unittest
|
||||
|
||||
from sum_of_multiples import (
|
||||
sum_of_multiples,
|
||||
)
|
||||
|
||||
|
||||
class SumOfMultiplesTest(unittest.TestCase):
|
||||
def test_no_multiples_within_limit(self):
|
||||
self.assertEqual(sum_of_multiples(1, [3, 5]), 0)
|
||||
|
||||
def test_one_factor_has_multiples_within_limit(self):
|
||||
self.assertEqual(sum_of_multiples(4, [3, 5]), 3)
|
||||
|
||||
def test_more_than_one_multiple_within_limit(self):
|
||||
self.assertEqual(sum_of_multiples(7, [3]), 9)
|
||||
|
||||
def test_more_than_one_factor_with_multiples_within_limit(self):
|
||||
self.assertEqual(sum_of_multiples(10, [3, 5]), 23)
|
||||
|
||||
def test_each_multiple_is_only_counted_once(self):
|
||||
self.assertEqual(sum_of_multiples(100, [3, 5]), 2318)
|
||||
|
||||
def test_a_much_larger_limit(self):
|
||||
self.assertEqual(sum_of_multiples(1000, [3, 5]), 233168)
|
||||
|
||||
def test_three_factors(self):
|
||||
self.assertEqual(sum_of_multiples(20, [7, 13, 17]), 51)
|
||||
|
||||
def test_factors_not_relatively_prime(self):
|
||||
self.assertEqual(sum_of_multiples(15, [4, 6]), 30)
|
||||
|
||||
def test_some_pairs_of_factors_relatively_prime_and_some_not(self):
|
||||
self.assertEqual(sum_of_multiples(150, [5, 6, 8]), 4419)
|
||||
|
||||
def test_one_factor_is_a_multiple_of_another(self):
|
||||
self.assertEqual(sum_of_multiples(51, [5, 25]), 275)
|
||||
|
||||
def test_much_larger_factors(self):
|
||||
self.assertEqual(sum_of_multiples(10000, [43, 47]), 2203160)
|
||||
|
||||
def test_all_numbers_are_multiples_of_1(self):
|
||||
self.assertEqual(sum_of_multiples(100, [1]), 4950)
|
||||
|
||||
def test_no_factors_means_an_empty_sum(self):
|
||||
self.assertEqual(sum_of_multiples(10000, []), 0)
|
||||
|
||||
def test_the_only_multiple_of_0_is_0(self):
|
||||
self.assertEqual(sum_of_multiples(1, [0]), 0)
|
||||
|
||||
def test_the_factor_0_does_not_affect_the_sum_of_multiples_of_other_factors(self):
|
||||
self.assertEqual(sum_of_multiples(4, [3, 0]), 3)
|
||||
|
||||
def test_solutions_using_include_exclude_must_extend_to_cardinality_greater_than_3(
|
||||
self,
|
||||
):
|
||||
self.assertEqual(sum_of_multiples(10000, [2, 3, 5, 7, 11]), 39614537)
|
||||
Reference in New Issue
Block a user