From 9135353bd5c0112eb2220481ded161bb178ae0b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Mon, 7 Oct 2024 22:18:52 -0700 Subject: [PATCH] Add `sum-of-multiples` (#354) --- config.json | 8 +++ .../sum-of-multiples/.docs/instructions.md | 27 +++++++++ .../sum-of-multiples/.docs/introduction.md | 6 ++ .../sum-of-multiples/.meta/config.json | 19 ++++++ .../sum-of-multiples/.meta/example.coffee | 13 +++++ .../sum-of-multiples/.meta/tests.toml | 58 +++++++++++++++++++ .../sum-of-multiples/sum-of-multiples.coffee | 4 ++ .../sum-of-multiples.spec.coffee | 50 ++++++++++++++++ 8 files changed, 185 insertions(+) create mode 100644 exercises/practice/sum-of-multiples/.docs/instructions.md create mode 100644 exercises/practice/sum-of-multiples/.docs/introduction.md create mode 100644 exercises/practice/sum-of-multiples/.meta/config.json create mode 100644 exercises/practice/sum-of-multiples/.meta/example.coffee create mode 100644 exercises/practice/sum-of-multiples/.meta/tests.toml create mode 100644 exercises/practice/sum-of-multiples/sum-of-multiples.coffee create mode 100644 exercises/practice/sum-of-multiples/sum-of-multiples.spec.coffee diff --git a/config.json b/config.json index 6b6ebfa..d27bbf7 100644 --- a/config.json +++ b/config.json @@ -535,6 +535,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "sum-of-multiples", + "name": "Sum of Multiples", + "uuid": "2e6dcbe2-bef0-4f37-b048-7701fe116c4c", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "triangle", "name": "Triangle", diff --git a/exercises/practice/sum-of-multiples/.docs/instructions.md b/exercises/practice/sum-of-multiples/.docs/instructions.md new file mode 100644 index 0000000..d69f890 --- /dev/null +++ b/exercises/practice/sum-of-multiples/.docs/instructions.md @@ -0,0 +1,27 @@ +# 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. diff --git a/exercises/practice/sum-of-multiples/.docs/introduction.md b/exercises/practice/sum-of-multiples/.docs/introduction.md new file mode 100644 index 0000000..69cabee --- /dev/null +++ b/exercises/practice/sum-of-multiples/.docs/introduction.md @@ -0,0 +1,6 @@ +# 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. diff --git a/exercises/practice/sum-of-multiples/.meta/config.json b/exercises/practice/sum-of-multiples/.meta/config.json new file mode 100644 index 0000000..dc47200 --- /dev/null +++ b/exercises/practice/sum-of-multiples/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "sum-of-multiples.coffee" + ], + "test": [ + "sum-of-multiples.spec.coffee" + ], + "example": [ + ".meta/example.coffee" + ] + }, + "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" +} diff --git a/exercises/practice/sum-of-multiples/.meta/example.coffee b/exercises/practice/sum-of-multiples/.meta/example.coffee new file mode 100644 index 0000000..cc9b883 --- /dev/null +++ b/exercises/practice/sum-of-multiples/.meta/example.coffee @@ -0,0 +1,13 @@ +class SumOfMultiples + @sum: (factors, limit) -> + multiples = [] + for i in [1..limit - 1] + for factor in factors + if i % factor is 0 + multiples.push i + break + multiples.reduce (a, b) -> + a + b + , 0 + +module.exports = SumOfMultiples diff --git a/exercises/practice/sum-of-multiples/.meta/tests.toml b/exercises/practice/sum-of-multiples/.meta/tests.toml new file mode 100644 index 0000000..1e9b124 --- /dev/null +++ b/exercises/practice/sum-of-multiples/.meta/tests.toml @@ -0,0 +1,58 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[54aaab5a-ce86-4edc-8b40-d3ab2400a279] +description = "no multiples within limit" + +[361e4e50-c89b-4f60-95ef-5bc5c595490a] +description = "one factor has multiples within limit" + +[e644e070-040e-4ae0-9910-93c69fc3f7ce] +description = "more than one multiple within limit" + +[607d6eb9-535c-41ce-91b5-3a61da3fa57f] +description = "more than one factor with multiples within limit" + +[f47e8209-c0c5-4786-b07b-dc273bf86b9b] +description = "each multiple is only counted once" + +[28c4b267-c980-4054-93e9-07723db615ac] +description = "a much larger limit" + +[09c4494d-ff2d-4e0f-8421-f5532821ee12] +description = "three factors" + +[2d0d5faa-f177-4ad6-bde9-ebb865083751] +description = "factors not relatively prime" + +[ece8f2e8-96aa-4166-bbb7-6ce71261e354] +description = "some pairs of factors relatively prime and some not" + +[624fdade-6ffb-400e-8472-456a38c171c0] +description = "one factor is a multiple of another" + +[949ee7eb-db51-479c-b5cb-4a22b40ac057] +description = "much larger factors" + +[41093673-acbd-482c-ab80-d00a0cbedecd] +description = "all numbers are multiples of 1" + +[1730453b-baaa-438e-a9c2-d754497b2a76] +description = "no factors means an empty sum" + +[214a01e9-f4bf-45bb-80f1-1dce9fbb0310] +description = "the only multiple of 0 is 0" + +[c423ae21-a0cb-4ec7-aeb1-32971af5b510] +description = "the factor 0 does not affect the sum of multiples of other factors" + +[17053ba9-112f-4ac0-aadb-0519dd836342] +description = "solutions using include-exclude must extend to cardinality greater than 3" diff --git a/exercises/practice/sum-of-multiples/sum-of-multiples.coffee b/exercises/practice/sum-of-multiples/sum-of-multiples.coffee new file mode 100644 index 0000000..7749144 --- /dev/null +++ b/exercises/practice/sum-of-multiples/sum-of-multiples.coffee @@ -0,0 +1,4 @@ +class SumOfMultiples + @sum: (factors, limit) -> + +module.exports = SumOfMultiples diff --git a/exercises/practice/sum-of-multiples/sum-of-multiples.spec.coffee b/exercises/practice/sum-of-multiples/sum-of-multiples.spec.coffee new file mode 100644 index 0000000..f701f98 --- /dev/null +++ b/exercises/practice/sum-of-multiples/sum-of-multiples.spec.coffee @@ -0,0 +1,50 @@ +SumOfMultiples = require './sum-of-multiples' + +describe 'Sum of Multiples', -> + it 'no multiples within limit', -> + expect(SumOfMultiples.sum [3, 5], 1).toEqual 0 + + xit 'one factor has multiples within limit', -> + expect(SumOfMultiples.sum [3, 5], 4).toEqual 3 + + xit 'more than one multiple within limit', -> + expect(SumOfMultiples.sum [3], 7).toEqual 9 + + xit 'more than one factor with multiples within limit', -> + expect(SumOfMultiples.sum [3, 5], 10).toEqual 23 + + xit 'each multiple is only counted once', -> + expect(SumOfMultiples.sum [3, 5], 100).toEqual 2318 + + xit 'a much larger limit', -> + expect(SumOfMultiples.sum [3, 5], 1000).toEqual 233168 + + xit 'three factors', -> + expect(SumOfMultiples.sum [7, 13, 17], 20).toEqual 51 + + xit 'factors not relatively prime', -> + expect(SumOfMultiples.sum [4, 6], 15).toEqual 30 + + xit 'some pairs of factors relatively prime and some not', -> + expect(SumOfMultiples.sum [5, 6, 8], 150).toEqual 4419 + + xit 'one factor is a multiple of another', -> + expect(SumOfMultiples.sum [5, 25], 51).toEqual 275 + + xit 'much larger factors', -> + expect(SumOfMultiples.sum [43, 47], 10000).toEqual 2203160 + + xit 'all numbers are multiples of 1', -> + expect(SumOfMultiples.sum [1], 100).toEqual 4950 + + xit 'no factors means an empty sum', -> + expect(SumOfMultiples.sum [], 10000).toEqual 0 + + xit 'the only multiple of 0 is 0', -> + expect(SumOfMultiples.sum [0], 1).toEqual 0 + + xit 'the factor 0 does not affect the sum of multiples of other factors', -> + expect(SumOfMultiples.sum [3, 0], 4).toEqual 3 + + xit 'solutions using include-exclude must extend to cardinality greater than 3', -> + expect(SumOfMultiples.sum [2, 3, 5, 7, 11], 10000).toEqual 39614537