-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
219 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
*.beam | ||
*.ez | ||
build | ||
erl_crash.dump |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# Help | ||
|
||
## Running the tests | ||
|
||
To run the tests, run the command `gleam test` from within the exercise directory. | ||
|
||
## Submitting your solution | ||
|
||
You can submit your solution using the `exercism submit src/sum_of_multiples.gleam` 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 [Gleam track's documentation](https://exercism.org/docs/tracks/gleam) | ||
- The [Gleam track's programming category on the forum](https://forum.exercism.org/c/programming/gleam) | ||
- [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. | ||
|
||
To get help if you're having trouble, you can use one of the following resources: | ||
|
||
- [gleam.run](https://gleam.run/documentation/) is the gleam official documentation. | ||
- [Discord](https://discord.gg/Fm8Pwmy) is the discord channel. | ||
- [StackOverflow](https://stackoverflow.com/questions/tagged/gleam) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
# Sum of Multiples | ||
|
||
Welcome to Sum of Multiples on Exercism's Gleam 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. | ||
|
||
## Source | ||
|
||
### Created by | ||
|
||
- @jiegillet | ||
|
||
### Based on | ||
|
||
A variation on Problem 1 at Project Euler - https://projecteuler.net/problem=1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
name = "sum_of_multiples" | ||
version = "0.1.0" | ||
|
||
[dependencies] | ||
gleam_bitwise = "~> 1.2" | ||
gleam_otp = "~> 0.7 or ~> 1.0" | ||
gleam_stdlib = "~> 0.32 or ~> 1.0" | ||
simplifile = "~> 1.0" | ||
gleam_erlang = ">= 0.25.0 and < 1.0.0" | ||
|
||
[dev-dependencies] | ||
exercism_test_runner = "~> 1.4" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
# This file was generated by Gleam | ||
# You typically do not need to edit this file | ||
|
||
packages = [ | ||
{ name = "argv", version = "1.0.1", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "A6E9009E50BBE863EB37D963E4315398D41A3D87D0075480FC244125808F964A" }, | ||
{ name = "exercism_test_runner", version = "1.7.0", build_tools = ["gleam"], requirements = ["argv", "gap", "glance", "gleam_community_ansi", "gleam_erlang", "gleam_json", "gleam_stdlib", "simplifile"], otp_app = "exercism_test_runner", source = "hex", outer_checksum = "2FC1BADB19BEC2AE77BFD2D3A606A014C85412A7B874CAFC4BA8CF04B0B257CD" }, | ||
{ name = "gap", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib"], otp_app = "gap", source = "hex", outer_checksum = "2EE1B0A17E85CF73A0C1D29DA315A2699117A8F549C8E8D89FA8261BE41EDEB1" }, | ||
{ name = "glance", version = "0.8.2", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "ACF09457E8B564AD7A0D823DAFDD326F58263C01ACB0D432A9BEFDEDD1DA8E73" }, | ||
{ name = "gleam_bitwise", version = "1.3.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_bitwise", source = "hex", outer_checksum = "B36E1D3188D7F594C7FD4F43D0D2CE17561DE896202017548578B16FE1FE9EFC" }, | ||
{ name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, | ||
{ name = "gleam_community_colour", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "A49A5E3AE8B637A5ACBA80ECB9B1AFE89FD3D5351FF6410A42B84F666D40D7D5" }, | ||
{ name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, | ||
{ name = "gleam_json", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "8B197DD5D578EA6AC2C0D4BDC634C71A5BCA8E7DB5F47091C263ECB411A60DF3" }, | ||
{ name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, | ||
{ name = "gleam_stdlib", version = "0.36.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "C0D14D807FEC6F8A08A7C9EF8DFDE6AE5C10E40E21325B2B29365965D82EB3D4" }, | ||
{ name = "glexer", version = "0.7.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "4484942A465482A0A100936E1E5F12314DB4B5AC0D87575A7B9E9062090B96BE" }, | ||
{ name = "simplifile", version = "1.5.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "EB9AA8E65E5C1E3E0FDCFC81BC363FD433CB122D7D062750FFDF24DE4AC40116" }, | ||
{ name = "thoas", version = "0.4.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "4918D50026C073C4AB1388437132C77A6F6F7C8AC43C60C13758CC0ADCE2134E" }, | ||
] | ||
|
||
[requirements] | ||
exercism_test_runner = { version = "~> 1.4" } | ||
gleam_bitwise = { version = "~> 1.2" } | ||
gleam_erlang = { version = ">= 0.25.0 and < 1.0.0"} | ||
gleam_otp = { version = "~> 0.7 or ~> 1.0" } | ||
gleam_stdlib = { version = "~> 0.32 or ~> 1.0" } | ||
simplifile = { version = "~> 1.0" } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
import gleam/list | ||
import gleam/int | ||
|
||
pub fn sum(factors factors: List(Int), limit limit: Int) -> Int { | ||
list.range(0, limit - 1) | ||
|> list.filter(fn(n) { list.any(factors, fn(f) { f > 0 && n % f == 0 }) }) | ||
|> int.sum | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
import exercism/should | ||
import exercism/test_runner | ||
import sum_of_multiples | ||
|
||
pub fn main() { | ||
test_runner.main() | ||
} | ||
|
||
pub fn no_multiples_within_limit_test() { | ||
sum_of_multiples.sum(factors: [3, 5], limit: 1) | ||
|> should.equal(0) | ||
} | ||
|
||
pub fn one_factor_has_multiples_within_limit_test() { | ||
sum_of_multiples.sum(factors: [3, 5], limit: 4) | ||
|> should.equal(3) | ||
} | ||
|
||
pub fn more_than_one_multiple_within_limit_test() { | ||
sum_of_multiples.sum(factors: [3], limit: 7) | ||
|> should.equal(9) | ||
} | ||
|
||
pub fn more_than_one_factor_with_multiples_within_limit_test() { | ||
sum_of_multiples.sum(factors: [3, 5], limit: 10) | ||
|> should.equal(23) | ||
} | ||
|
||
pub fn each_multiple_is_only_counted_once_test() { | ||
sum_of_multiples.sum(factors: [3, 5], limit: 100) | ||
|> should.equal(2318) | ||
} | ||
|
||
pub fn a_much_larger_limit_test() { | ||
sum_of_multiples.sum(factors: [3, 5], limit: 1000) | ||
|> should.equal(233_168) | ||
} | ||
|
||
pub fn three_factors_test() { | ||
sum_of_multiples.sum(factors: [7, 13, 17], limit: 20) | ||
|> should.equal(51) | ||
} | ||
|
||
pub fn factors_not_relatively_prime_test() { | ||
sum_of_multiples.sum(factors: [4, 6], limit: 15) | ||
|> should.equal(30) | ||
} | ||
|
||
pub fn some_pairs_of_factors_relatively_prime_and_some_not_test() { | ||
sum_of_multiples.sum(factors: [5, 6, 8], limit: 150) | ||
|> should.equal(4419) | ||
} | ||
|
||
pub fn one_factor_is_a_multiple_of_another_test() { | ||
sum_of_multiples.sum(factors: [5, 25], limit: 51) | ||
|> should.equal(275) | ||
} | ||
|
||
pub fn much_larger_factors_test() { | ||
sum_of_multiples.sum(factors: [43, 47], limit: 10_000) | ||
|> should.equal(2_203_160) | ||
} | ||
|
||
pub fn all_numbers_are_multiples_of_1_test() { | ||
sum_of_multiples.sum(factors: [1], limit: 100) | ||
|> should.equal(4950) | ||
} | ||
|
||
pub fn no_factors_means_an_empty_sum_test() { | ||
sum_of_multiples.sum(factors: [], limit: 10_000) | ||
|> should.equal(0) | ||
} | ||
|
||
pub fn the_only_multiple_of_0_is_0_test() { | ||
sum_of_multiples.sum(factors: [0], limit: 1) | ||
|> should.equal(0) | ||
} | ||
|
||
pub fn the_factor_0_does_not_affect_the_sum_of_multiples_of_other_factors_test() { | ||
sum_of_multiples.sum(factors: [3, 0], limit: 4) | ||
|> should.equal(3) | ||
} | ||
|
||
pub fn solutions_using_include_exclude_must_extend_to_cardinality_greater_than_3_test() { | ||
sum_of_multiples.sum(factors: [2, 3, 5, 7, 11], limit: 10_000) | ||
|> should.equal(39_614_537) | ||
} |