diff --git a/config.json b/config.json index 2d80594..9c3f3e2 100644 --- a/config.json +++ b/config.json @@ -508,6 +508,14 @@ "prerequisites": [], "difficulty": 3 }, + { + "slug": "sum-of-multiples", + "name": "Sum of Multiples", + "uuid": "fd01910f-030d-4d77-b7bc-019bd29b64ae", + "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..7be9c3f --- /dev/null +++ b/exercises/practice/sum-of-multiples/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "sum_of_multiples.vim" + ], + "test": [ + "sum_of_multiples.vader" + ], + "example": [ + ".meta/example.vim" + ] + }, + "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.vim b/exercises/practice/sum-of-multiples/.meta/example.vim new file mode 100644 index 0000000..f38647c --- /dev/null +++ b/exercises/practice/sum-of-multiples/.meta/example.vim @@ -0,0 +1,18 @@ +function! Sum(factors, limit) abort + let l:multiples = [] + for l:i in range(1, a:limit - 1) + for l:factor in a:factors + if l:i % l:factor == 0 && l:factor != 0 + call add(l:multiples, l:i) + break + endif + endfor + endfor + + let l:sum = 0 + for l:multiple in l:multiples + let l:sum += l:multiple + endfor + + return l:sum +endfunction 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.vader b/exercises/practice/sum-of-multiples/sum_of_multiples.vader new file mode 100644 index 0000000..62f0ed5 --- /dev/null +++ b/exercises/practice/sum-of-multiples/sum_of_multiples.vader @@ -0,0 +1,95 @@ +Execute (no multiples within limit): + let g:factors = [3, 5] + let g:limit = 1 + let g:expected = 0 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (one factor has multiples within limit): + let g:factors = [3, 5] + let g:limit = 4 + let g:expected = 3 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (more than one multiple within limit): + let g:factors = [3] + let g:limit = 7 + let g:expected = 9 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (more than one factor with multiples within limit): + let g:factors = [3, 5] + let g:limit = 10 + let g:expected = 23 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (each multiple is only counted once): + let g:factors = [3, 5] + let g:limit = 100 + let g:expected = 2318 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (a much larger limit): + let g:factors = [3, 5] + let g:limit = 1000 + let g:expected = 233168 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (three factors): + let g:factors = [7, 13, 17] + let g:limit = 20 + let g:expected = 51 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (factors not relatively prime): + let g:factors = [4, 6] + let g:limit = 15 + let g:expected = 30 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (some pairs of factors relatively prime and some not): + let g:factors = [5, 6, 8] + let g:limit = 150 + let g:expected = 4419 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (one factor is a multiple of another): + let g:factors = [5, 25] + let g:limit = 51 + let g:expected = 275 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (much larger factors): + let g:factors = [43, 47] + let g:limit = 10000 + let g:expected = 2203160 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (all numbers are multiples of 1): + let g:factors = [1] + let g:limit = 100 + let g:expected = 4950 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (no factors means an empty sum): + let g:factors = [] + let g:limit = 10000 + let g:expected = 0 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (the only multiple of 0 is 0): + let g:factors = [0] + let g:limit = 1 + let g:expected = 0 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (the factor 0 does not affect the sum of multiples of other factors): + let g:factors = [3, 0] + let g:limit = 4 + let g:expected = 3 + AssertEqual g:expected, Sum(g:factors, g:limit) + +Execute (solutions using include-exclude must extend to cardinality greater than 3): + let g:factors = [2, 3, 5, 7, 11] + let g:limit = 10000 + let g:expected = 39614537 + AssertEqual g:expected, Sum(g:factors, g:limit) diff --git a/exercises/practice/sum-of-multiples/sum_of_multiples.vim b/exercises/practice/sum-of-multiples/sum_of_multiples.vim new file mode 100644 index 0000000..5cfef22 --- /dev/null +++ b/exercises/practice/sum-of-multiples/sum_of_multiples.vim @@ -0,0 +1,14 @@ +" +" Given a number, find the sum of all the unique multiples +" up to but not including that number. +" +" Examples: +" :echo Sum([3, 5], 4) +" 3 +" +" :echo Sum([2, 3, 5, 7, 11], 10000) +" 39614537 +" +function! Sum(factors, limit) abort + " your code goes here +endfunction \ No newline at end of file