first commit
This commit is contained in:
21
bettys-bike-shop/.exercism/config.json
Normal file
21
bettys-bike-shop/.exercism/config.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"lpil"
|
||||||
|
],
|
||||||
|
"files": {
|
||||||
|
"solution": [
|
||||||
|
"src/bettys_bike_shop.gleam"
|
||||||
|
],
|
||||||
|
"test": [
|
||||||
|
"test/bettys_bike_shop_test.gleam"
|
||||||
|
],
|
||||||
|
"exemplar": [
|
||||||
|
".meta/example.gleam"
|
||||||
|
],
|
||||||
|
"invalidator": [
|
||||||
|
"gleam.toml",
|
||||||
|
"manifest.toml"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"blurb": "Learn about modules by helping Betty to display her bikes prices."
|
||||||
|
}
|
||||||
1
bettys-bike-shop/.exercism/metadata.json
Normal file
1
bettys-bike-shop/.exercism/metadata.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"track":"gleam","exercise":"bettys-bike-shop","id":"b4a2caa61c2b4c8c8e5a417166807ec8","url":"https://exercism.org/tracks/gleam/exercises/bettys-bike-shop","handle":"limpit","is_requester":true,"auto_approve":false}
|
||||||
4
bettys-bike-shop/.gitignore
vendored
Normal file
4
bettys-bike-shop/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
*.beam
|
||||||
|
*.ez
|
||||||
|
build
|
||||||
|
erl_crash.dump
|
||||||
32
bettys-bike-shop/HELP.md
Normal file
32
bettys-bike-shop/HELP.md
Normal file
@@ -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/bettys_bike_shop.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.
|
||||||
13
bettys-bike-shop/HINTS.md
Normal file
13
bettys-bike-shop/HINTS.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Hints
|
||||||
|
|
||||||
|
## General
|
||||||
|
|
||||||
|
- Int and float operators are described in [the language tour][tour].
|
||||||
|
- Functions for working with ints are defined in the [`gleam/int` module][int].
|
||||||
|
- Functions for working with floats are defined in the [`gleam/float` module][float].
|
||||||
|
- Functions for working with strings are defined in the [`gleam/string` module][string].
|
||||||
|
|
||||||
|
[tour]: https://gleam.run/book/tour/ints-and-floats.html
|
||||||
|
[int]: https://hexdocs.pm/gleam_stdlib/gleam/int.html
|
||||||
|
[float]: https://hexdocs.pm/gleam_stdlib/gleam/float.html
|
||||||
|
[string]: https://hexdocs.pm/gleam_stdlib/gleam/string.html
|
||||||
175
bettys-bike-shop/README.md
Normal file
175
bettys-bike-shop/README.md
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
# Betty's Bike Shop
|
||||||
|
|
||||||
|
Welcome to Betty's Bike Shop on Exercism's Gleam Track.
|
||||||
|
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||||
|
If you get stuck on the exercise, check out `HINTS.md`, but try and solve it without using those first :)
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
## Ints
|
||||||
|
|
||||||
|
There are two different kinds of numbers in Gleam - ints and floats.
|
||||||
|
|
||||||
|
Ints are whole numbers.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
let integer = 3
|
||||||
|
// -> 3
|
||||||
|
```
|
||||||
|
|
||||||
|
Gleam has several operators that work with ints.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
1 + 1 // -> 2
|
||||||
|
5 - 1 // -> 4
|
||||||
|
5 / 2 // -> 2
|
||||||
|
3 * 3 // -> 9
|
||||||
|
5 % 2 // -> 1
|
||||||
|
|
||||||
|
2 > 1 // -> True
|
||||||
|
2 < 1 // -> False
|
||||||
|
2 >= 1 // -> True
|
||||||
|
2 <= 1 // -> False
|
||||||
|
```
|
||||||
|
|
||||||
|
## Floats
|
||||||
|
|
||||||
|
Floats are numbers with one or more digits behind the decimal separator.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
let float = 3.45
|
||||||
|
// -> 3.45
|
||||||
|
```
|
||||||
|
|
||||||
|
Floats also have their own set of operators.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
1.0 +. 1.4 // -> 2.4
|
||||||
|
5.0 -. 1.5 // -> 3.5
|
||||||
|
5.0 /. 2.0 // -> 2.5
|
||||||
|
3.0 *. 3.1 // -> 9.3
|
||||||
|
|
||||||
|
2.0 >. 1.0 // -> True
|
||||||
|
2.0 <. 1.0 // -> False
|
||||||
|
2.0 >=. 1.0 // -> True
|
||||||
|
2.0 <=. 1.0 // -> False
|
||||||
|
```
|
||||||
|
|
||||||
|
## Modules
|
||||||
|
|
||||||
|
### Modules
|
||||||
|
|
||||||
|
Gleam code is organised into modules, and each file is one Gleam module.
|
||||||
|
|
||||||
|
Up until now we have written functions with the `pub fn` syntax, which defines a function that is publicly available to other modules. Functions defined with `fn` are private to the module they are defined in and cannot be used by other modules.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
// This function is public
|
||||||
|
pub fn add(x, y) {
|
||||||
|
x + y
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is private
|
||||||
|
fn subtract(x, y) {
|
||||||
|
x - y
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Gleam modules have names, and the name is based on their file path within the `src` or `test` directory.
|
||||||
|
|
||||||
|
For example, a module defined in `src\geometry\rectangle.gleam` (on Windows) or `src/geometry/rectangle.gleam` (on UNIX-like operating systems) would be named `geometry/rectangle`.
|
||||||
|
|
||||||
|
### Importing functions from other modules
|
||||||
|
|
||||||
|
Accessing functions defined in other modules is done via imports.
|
||||||
|
All functions within that module that were exposed by it are made accessible when importing that module.
|
||||||
|
But how they are accessed varies depending on how the module is imported.
|
||||||
|
|
||||||
|
Qualified imports are the default, and accessing a function within such module (for example the `map` function in the `gleam/list` module) is done by prefixing the module name (`list.map`).
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
// Import the int module
|
||||||
|
import gleam/int
|
||||||
|
|
||||||
|
pub fn run(x: Int) -> String {
|
||||||
|
// Use the to_string function from the int module
|
||||||
|
int.to_string(x)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
By default the name used to refer to the module is the last part of the module name, in this case `int`, but this can be changed by using the `as` keyword.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
// Import the int module and refer to it as i
|
||||||
|
import gleam/int as i
|
||||||
|
|
||||||
|
pub fn run(x: Int) -> String {
|
||||||
|
i.to_string(x)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Unqualified imports enable direct access to the exposed functions within that module, without prefixing.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
// Import the to_string function from the int module
|
||||||
|
import gleam/int.{to_string}
|
||||||
|
|
||||||
|
pub fn run(x: Int) -> String {
|
||||||
|
to_string(x)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Qualified imports are preferred as they make it clearer to the reader where a function comes from, and to avoid name clashes.
|
||||||
|
|
||||||
|
|
||||||
|
### Standard library
|
||||||
|
|
||||||
|
Gleam has a rich and well-documented standard library. The documentation is available online at [hexdocs.pm/gleam_stdlib][docs]. Save this link somewhere - you will use it a lot!
|
||||||
|
|
||||||
|
Most built-in data types have a corresponding module that offers functions for working with that data type, e.g. there's the `gleam/int` module for ints, `gleam/string` module for strings, `gleam/list` module for lists and so on.
|
||||||
|
|
||||||
|
[docs]: https://hexdocs.pm/gleam_stdlib/
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
In this exercise you're going to write some code to help Betty's Bike Shop, an online shop for bikes and parts.
|
||||||
|
You have three tasks, aiming at correctly displaying the bikes and parts prices on the website.
|
||||||
|
|
||||||
|
## 1. Export the `pence_to_pounds` function
|
||||||
|
|
||||||
|
Your colleague has already written the skeleton of the module, the incomplete functions `pence_to_pounds` and `pounds_to_string`.
|
||||||
|
However, they have forgotten to export the `pence_to_pounds` function, so it is currently not visible by other modules or by the test suite.
|
||||||
|
|
||||||
|
Export the `pence_to_pounds` function.
|
||||||
|
|
||||||
|
## 2. Convert pence to pounds
|
||||||
|
|
||||||
|
Currently, the price is stored as an integer number of *pence* (the bike shop is based in the UK).
|
||||||
|
On the website, we want to show the price in *pounds*, where 1.00 pound amounts to 100 pence.
|
||||||
|
Your first task is to implement the `pence_to_pounds` function, taking an `Int` amount of pence, and converting it into its equivalent pounds as a `Float`.
|
||||||
|
You should also add type annotations for that function.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pence_to_pounds(106)
|
||||||
|
// -> 1.06
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Format the price for display on the website
|
||||||
|
|
||||||
|
Since Betty's bikes are sold in pounds, prices should be displayed with the symbol "£".
|
||||||
|
Your second task is thus to implement the `pounds_to_string` function, taking an amount of pounds as a `Float` and returning its price displayed as a `String` with the pound symbol prepended.
|
||||||
|
|
||||||
|
You should import the `gleam/float` and `gleam/string` modules before using them.
|
||||||
|
|
||||||
|
You should also define the type annotation for `pounds_to_string`.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pounds_to_string(1.06)
|
||||||
|
// -> "£1.06"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
### Created by
|
||||||
|
|
||||||
|
- @lpil
|
||||||
14
bettys-bike-shop/gleam.toml
Normal file
14
bettys-bike-shop/gleam.toml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
name = "bettys_bike_shop"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
gleam_otp = "~> 0.7 or ~> 1.0"
|
||||||
|
gleam_stdlib = ">= 0.54.0 or ~> 1.0"
|
||||||
|
simplifile = "~> 1.0"
|
||||||
|
gleam_erlang = ">= 0.25.0 and < 1.0.0"
|
||||||
|
gleam_yielder = ">= 1.1.0 and < 2.0.0"
|
||||||
|
gleam_regexp = ">= 1.1.0 and < 2.0.0"
|
||||||
|
gleam_deque = ">= 1.0.0 and < 2.0.0"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
exercism_test_runner = "~> 1.9"
|
||||||
31
bettys-bike-shop/manifest.toml
Normal file
31
bettys-bike-shop/manifest.toml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# This file was generated by Gleam
|
||||||
|
# You typically do not need to edit this file
|
||||||
|
|
||||||
|
packages = [
|
||||||
|
{ name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" },
|
||||||
|
{ name = "exercism_test_runner", version = "1.9.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 = "0B17BB25F2FF1E60266467C24FE0CA04005410306AA05E9A4B41B1852D72865C" },
|
||||||
|
{ name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" },
|
||||||
|
{ name = "gap", version = "1.1.3", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib"], otp_app = "gap", source = "hex", outer_checksum = "6EF5E3B523FDFBC317E9EA28D5163EE04744A97C007106F90207569789612291" },
|
||||||
|
{ name = "glance", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "E155BA1A787FD11827048355021C0390D2FE9A518485526F631A9D472858CC6D" },
|
||||||
|
{ name = "gleam_community_ansi", version = "1.4.3", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "8A62AE9CC6EA65BEA630D95016D6C07E4F9973565FA3D0DE68DC4200D8E0DD27" },
|
||||||
|
{ name = "gleam_community_colour", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "FDD6AC62C6EC8506C005949A4FCEF032038191D5EAAEC3C9A203CD53AE956ACA" },
|
||||||
|
{ name = "gleam_deque", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_deque", source = "hex", outer_checksum = "64D77068931338CF0D0CB5D37522C3E3CCA7CB7D6C5BACB41648B519CC0133C7" },
|
||||||
|
{ name = "gleam_erlang", version = "0.34.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "0C38F2A128BAA0CEF17C3000BD2097EB80634E239CE31A86400C4416A5D0FDCC" },
|
||||||
|
{ name = "gleam_json", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "C55C5C2B318533A8072D221C5E06E5A75711C129E420DD1CE463342106012E5D" },
|
||||||
|
{ name = "gleam_otp", version = "0.16.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "50DA1539FC8E8FA09924EB36A67A2BBB0AD6B27BCDED5A7EF627057CF69D035E" },
|
||||||
|
{ name = "gleam_regexp", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "7F5E0C0BBEB3C58E57C9CB05FA9002F970C85AD4A63BA1E55CBCB35C15809179" },
|
||||||
|
{ name = "gleam_stdlib", version = "0.55.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "32D8F4AE03771516950047813A9E359249BD9FBA5C33463FDB7B953D6F8E896B" },
|
||||||
|
{ name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" },
|
||||||
|
{ name = "glexer", version = "2.2.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "5C235CBDF4DA5203AD5EAB1D6D8B456ED8162C5424FE2309CFFB7EF438B7C269" },
|
||||||
|
{ name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[requirements]
|
||||||
|
exercism_test_runner = { version = "~> 1.9" }
|
||||||
|
gleam_deque = { version = ">= 1.0.0 and < 2.0.0" }
|
||||||
|
gleam_erlang = { version = ">= 0.25.0 and < 1.0.0" }
|
||||||
|
gleam_otp = { version = "~> 0.7 or ~> 1.0" }
|
||||||
|
gleam_regexp = { version = ">= 1.1.0 and < 2.0.0" }
|
||||||
|
gleam_stdlib = { version = ">= 0.54.0 or ~> 1.0" }
|
||||||
|
gleam_yielder = { version = ">= 1.1.0 and < 2.0.0" }
|
||||||
|
simplifile = { version = "~> 1.0" }
|
||||||
14
bettys-bike-shop/src/bettys_bike_shop.gleam
Normal file
14
bettys-bike-shop/src/bettys_bike_shop.gleam
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import gleam/float
|
||||||
|
import gleam/int
|
||||||
|
|
||||||
|
// TODO: import the `gleam/int` module
|
||||||
|
// TODO: import the `gleam/float` module
|
||||||
|
// TODO: import the `gleam/string` module
|
||||||
|
|
||||||
|
pub fn pence_to_pounds(pence: Int) -> Float {
|
||||||
|
int.to_float(pence) /. 100.0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn pounds_to_string(pounds: Float) {
|
||||||
|
"£" <> float.to_string(pounds)
|
||||||
|
}
|
||||||
27
bettys-bike-shop/test/bettys_bike_shop_test.gleam
Normal file
27
bettys-bike-shop/test/bettys_bike_shop_test.gleam
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import bettys_bike_shop
|
||||||
|
import exercism/should
|
||||||
|
import exercism/test_runner
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
test_runner.main()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn pence_to_pounds_599_is_5_99_pounds_test() {
|
||||||
|
bettys_bike_shop.pence_to_pounds(599)
|
||||||
|
|> should.equal(5.99)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn pence_to_pounds_33_is_0_33_pounds_test() {
|
||||||
|
bettys_bike_shop.pence_to_pounds(33)
|
||||||
|
|> should.equal(0.33)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn pounds_to_string_5_99_test() {
|
||||||
|
bettys_bike_shop.pounds_to_string(5.99)
|
||||||
|
|> should.equal("£5.99")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn pounds_to_string_0_33_test() {
|
||||||
|
bettys_bike_shop.pounds_to_string(0.33)
|
||||||
|
|> should.equal("£0.33")
|
||||||
|
}
|
||||||
26
difference-of-squares/.exercism/config.json
Normal file
26
difference-of-squares/.exercism/config.json
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"nono"
|
||||||
|
],
|
||||||
|
"contributors": [
|
||||||
|
"lpil"
|
||||||
|
],
|
||||||
|
"files": {
|
||||||
|
"solution": [
|
||||||
|
"src/difference_of_squares.gleam"
|
||||||
|
],
|
||||||
|
"test": [
|
||||||
|
"test/difference_of_squares_test.gleam"
|
||||||
|
],
|
||||||
|
"example": [
|
||||||
|
".meta/example.gleam"
|
||||||
|
],
|
||||||
|
"invalidator": [
|
||||||
|
"gleam.toml",
|
||||||
|
"manifest.toml"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"blurb": "Find the difference between the square of the sum and the sum of the squares of the first N natural numbers.",
|
||||||
|
"source": "Problem 6 at Project Euler",
|
||||||
|
"source_url": "https://projecteuler.net/problem=6"
|
||||||
|
}
|
||||||
1
difference-of-squares/.exercism/metadata.json
Normal file
1
difference-of-squares/.exercism/metadata.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"track":"gleam","exercise":"difference-of-squares","id":"f3b4229766be432cba603a0eaa6817c2","url":"https://exercism.org/tracks/gleam/exercises/difference-of-squares","handle":"limpit","is_requester":true,"auto_approve":false}
|
||||||
4
difference-of-squares/.gitignore
vendored
Normal file
4
difference-of-squares/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
*.beam
|
||||||
|
*.ez
|
||||||
|
build
|
||||||
|
erl_crash.dump
|
||||||
32
difference-of-squares/HELP.md
Normal file
32
difference-of-squares/HELP.md
Normal file
@@ -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/difference_of_squares.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.
|
||||||
33
difference-of-squares/README.md
Normal file
33
difference-of-squares/README.md
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# Difference Of Squares
|
||||||
|
|
||||||
|
Welcome to Difference Of Squares on Exercism's Gleam Track.
|
||||||
|
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
Find the difference between the square of the sum and the sum of the squares of the first N natural numbers.
|
||||||
|
|
||||||
|
The square of the sum of the first ten natural numbers is
|
||||||
|
(1 + 2 + ... + 10)² = 55² = 3025.
|
||||||
|
|
||||||
|
The sum of the squares of the first ten natural numbers is
|
||||||
|
1² + 2² + ... + 10² = 385.
|
||||||
|
|
||||||
|
Hence the difference between the square of the sum of the first ten natural numbers and the sum of the squares of the first ten natural numbers is 3025 - 385 = 2640.
|
||||||
|
|
||||||
|
You are not expected to discover an efficient solution to this yourself from first principles; research is allowed, indeed, encouraged.
|
||||||
|
Finding the best algorithm for the problem is a key skill in software engineering.
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
### Created by
|
||||||
|
|
||||||
|
- @nono
|
||||||
|
|
||||||
|
### Contributed to by
|
||||||
|
|
||||||
|
- @lpil
|
||||||
|
|
||||||
|
### Based on
|
||||||
|
|
||||||
|
Problem 6 at Project Euler - https://projecteuler.net/problem=6
|
||||||
14
difference-of-squares/gleam.toml
Normal file
14
difference-of-squares/gleam.toml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
name = "difference_of_squares"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
gleam_otp = "~> 0.7 or ~> 1.0"
|
||||||
|
gleam_stdlib = ">= 0.54.0 or ~> 1.0"
|
||||||
|
simplifile = "~> 1.0"
|
||||||
|
gleam_erlang = ">= 0.25.0 and < 1.0.0"
|
||||||
|
gleam_yielder = ">= 1.1.0 and < 2.0.0"
|
||||||
|
gleam_regexp = ">= 1.1.0 and < 2.0.0"
|
||||||
|
gleam_deque = ">= 1.0.0 and < 2.0.0"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
exercism_test_runner = "~> 1.9"
|
||||||
31
difference-of-squares/manifest.toml
Normal file
31
difference-of-squares/manifest.toml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# This file was generated by Gleam
|
||||||
|
# You typically do not need to edit this file
|
||||||
|
|
||||||
|
packages = [
|
||||||
|
{ name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" },
|
||||||
|
{ name = "exercism_test_runner", version = "1.9.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 = "0B17BB25F2FF1E60266467C24FE0CA04005410306AA05E9A4B41B1852D72865C" },
|
||||||
|
{ name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" },
|
||||||
|
{ name = "gap", version = "1.1.3", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib"], otp_app = "gap", source = "hex", outer_checksum = "6EF5E3B523FDFBC317E9EA28D5163EE04744A97C007106F90207569789612291" },
|
||||||
|
{ name = "glance", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "E155BA1A787FD11827048355021C0390D2FE9A518485526F631A9D472858CC6D" },
|
||||||
|
{ name = "gleam_community_ansi", version = "1.4.3", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "8A62AE9CC6EA65BEA630D95016D6C07E4F9973565FA3D0DE68DC4200D8E0DD27" },
|
||||||
|
{ name = "gleam_community_colour", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "FDD6AC62C6EC8506C005949A4FCEF032038191D5EAAEC3C9A203CD53AE956ACA" },
|
||||||
|
{ name = "gleam_deque", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_deque", source = "hex", outer_checksum = "64D77068931338CF0D0CB5D37522C3E3CCA7CB7D6C5BACB41648B519CC0133C7" },
|
||||||
|
{ name = "gleam_erlang", version = "0.34.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "0C38F2A128BAA0CEF17C3000BD2097EB80634E239CE31A86400C4416A5D0FDCC" },
|
||||||
|
{ name = "gleam_json", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "C55C5C2B318533A8072D221C5E06E5A75711C129E420DD1CE463342106012E5D" },
|
||||||
|
{ name = "gleam_otp", version = "0.16.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "50DA1539FC8E8FA09924EB36A67A2BBB0AD6B27BCDED5A7EF627057CF69D035E" },
|
||||||
|
{ name = "gleam_regexp", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "7F5E0C0BBEB3C58E57C9CB05FA9002F970C85AD4A63BA1E55CBCB35C15809179" },
|
||||||
|
{ name = "gleam_stdlib", version = "0.55.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "32D8F4AE03771516950047813A9E359249BD9FBA5C33463FDB7B953D6F8E896B" },
|
||||||
|
{ name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" },
|
||||||
|
{ name = "glexer", version = "2.2.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "5C235CBDF4DA5203AD5EAB1D6D8B456ED8162C5424FE2309CFFB7EF438B7C269" },
|
||||||
|
{ name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[requirements]
|
||||||
|
exercism_test_runner = { version = "~> 1.9" }
|
||||||
|
gleam_deque = { version = ">= 1.0.0 and < 2.0.0" }
|
||||||
|
gleam_erlang = { version = ">= 0.25.0 and < 1.0.0" }
|
||||||
|
gleam_otp = { version = "~> 0.7 or ~> 1.0" }
|
||||||
|
gleam_regexp = { version = ">= 1.1.0 and < 2.0.0" }
|
||||||
|
gleam_stdlib = { version = ">= 0.54.0 or ~> 1.0" }
|
||||||
|
gleam_yielder = { version = ">= 1.1.0 and < 2.0.0" }
|
||||||
|
simplifile = { version = "~> 1.0" }
|
||||||
11
difference-of-squares/src/difference_of_squares.gleam
Normal file
11
difference-of-squares/src/difference_of_squares.gleam
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
pub fn square_of_sum(n: Int) -> Int {
|
||||||
|
todo as "Implement this function"
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sum_of_squares(n: Int) -> Int {
|
||||||
|
todo as "Implement this function"
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn difference(n: Int) -> Int {
|
||||||
|
todo as "Implement this function"
|
||||||
|
}
|
||||||
52
difference-of-squares/test/difference_of_squares_test.gleam
Normal file
52
difference-of-squares/test/difference_of_squares_test.gleam
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import difference_of_squares
|
||||||
|
import exercism/should
|
||||||
|
import exercism/test_runner
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
test_runner.main()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn square_of_sum_1_test() {
|
||||||
|
difference_of_squares.square_of_sum(1)
|
||||||
|
|> should.equal(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn square_of_sum_5_test() {
|
||||||
|
difference_of_squares.square_of_sum(5)
|
||||||
|
|> should.equal(225)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn square_of_sum_100_test() {
|
||||||
|
difference_of_squares.square_of_sum(100)
|
||||||
|
|> should.equal(25_502_500)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sum_of_squares_1_test() {
|
||||||
|
difference_of_squares.sum_of_squares(1)
|
||||||
|
|> should.equal(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sum_of_squares_5_test() {
|
||||||
|
difference_of_squares.sum_of_squares(5)
|
||||||
|
|> should.equal(55)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sum_of_squares_100_test() {
|
||||||
|
difference_of_squares.sum_of_squares(100)
|
||||||
|
|> should.equal(338_350)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn difference_of_squares_1_test() {
|
||||||
|
difference_of_squares.difference(1)
|
||||||
|
|> should.equal(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn difference_of_squares_5_test() {
|
||||||
|
difference_of_squares.difference(5)
|
||||||
|
|> should.equal(170)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn difference_of_squares_100_test() {
|
||||||
|
difference_of_squares.difference(100)
|
||||||
|
|> should.equal(25_164_150)
|
||||||
|
}
|
||||||
24
guessing-game/.exercism/config.json
Normal file
24
guessing-game/.exercism/config.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"lpil"
|
||||||
|
],
|
||||||
|
"files": {
|
||||||
|
"solution": [
|
||||||
|
"src/guessing_game.gleam"
|
||||||
|
],
|
||||||
|
"test": [
|
||||||
|
"test/guessing_game_test.gleam"
|
||||||
|
],
|
||||||
|
"exemplar": [
|
||||||
|
".meta/example.gleam"
|
||||||
|
],
|
||||||
|
"invalidator": [
|
||||||
|
"gleam.toml",
|
||||||
|
"manifest.toml"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forked_from": [
|
||||||
|
"fsharp/guessing-game"
|
||||||
|
],
|
||||||
|
"blurb": "Learn about case expressions by implementing a simple game in which the player needs to guess a secret number"
|
||||||
|
}
|
||||||
1
guessing-game/.exercism/metadata.json
Normal file
1
guessing-game/.exercism/metadata.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"track":"gleam","exercise":"guessing-game","id":"c952115184c243c0b6c9eb686c8f186f","url":"https://exercism.org/tracks/gleam/exercises/guessing-game","handle":"limpit","is_requester":true,"auto_approve":false}
|
||||||
4
guessing-game/.gitignore
vendored
Normal file
4
guessing-game/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
*.beam
|
||||||
|
*.ez
|
||||||
|
build
|
||||||
|
erl_crash.dump
|
||||||
32
guessing-game/HELP.md
Normal file
32
guessing-game/HELP.md
Normal file
@@ -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/guessing_game.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.
|
||||||
23
guessing-game/HINTS.md
Normal file
23
guessing-game/HINTS.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Hints
|
||||||
|
|
||||||
|
## General
|
||||||
|
|
||||||
|
- [This page][case-expressions] has a nice introduction to case expressions in Gleam.
|
||||||
|
|
||||||
|
## 1. Reply to a correct guess
|
||||||
|
|
||||||
|
- You can use a literal pattern to match on a specific number.
|
||||||
|
|
||||||
|
## 2. Reply to a close guess
|
||||||
|
|
||||||
|
- You can either use a literal pattern or a variable pattern and a guard.
|
||||||
|
|
||||||
|
## 3. Reply to too low guesses
|
||||||
|
|
||||||
|
- You can use a combination of a variable pattern and a guard.
|
||||||
|
|
||||||
|
## 4. Reply to too high guesses
|
||||||
|
|
||||||
|
- You can use a combination of a variable pattern and a guard, or a discard pattern.
|
||||||
|
|
||||||
|
[case-expressions]: https://gleam.run/book/tour/case-expressions.html
|
||||||
132
guessing-game/README.md
Normal file
132
guessing-game/README.md
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
# Guessing Game
|
||||||
|
|
||||||
|
Welcome to Guessing Game on Exercism's Gleam Track.
|
||||||
|
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||||
|
If you get stuck on the exercise, check out `HINTS.md`, but try and solve it without using those first :)
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
## Case Expressions
|
||||||
|
|
||||||
|
In Gleam a `case` expression can be used to conditionally execute code. With a case expression a value can be tested against one or more _patterns_. An example of such a pattern is the _literal pattern_, which matches a value against a literal value (e.g. `1` or `"hello"`).
|
||||||
|
|
||||||
|
Case expressions are written with the `case` keyword:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pub fn describe(number: Int) -> String {
|
||||||
|
case number {
|
||||||
|
0 -> "Zero"
|
||||||
|
1 -> "One"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
While this may look like `switch` statements in other languages, pattern matching starts to shine when also using other patterns. One such pattern is the _variable pattern_, which allows one to assign a value to a variable. In this example, the variable `i` will be assigned the value of `number` if it is not `0`:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pub fn describe(number: Int) -> String {
|
||||||
|
case number {
|
||||||
|
0 -> "Zero"
|
||||||
|
i -> "Non zero"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In some cases, you may want to add an additional condition to a pattern. This is known as a _guard_ (clause), which can be added using the `if` keyword:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pub fn describe(number: Int) -> String {
|
||||||
|
case number {
|
||||||
|
0 -> "Zero"
|
||||||
|
i if i < 0 -> "Negative number"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For performance reasons only basic mathematical and boolean operators are allowed in guards, other functions cannot be used in guards.
|
||||||
|
|
||||||
|
In the above example, not all possible input will have a matching pattern. The compiler will detect this and output an error. This is known as _exhaustive checking_. To solve the warning, one has to handle all cases. For this, the _discard pattern_ can be used, which is a pattern that matches on any value:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pub fn describe(number: Int) -> String {
|
||||||
|
case number {
|
||||||
|
0 -> "Zero"
|
||||||
|
i if i < 0 -> "Negative number"
|
||||||
|
_ -> "Positive number"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No compiler error
|
||||||
|
```
|
||||||
|
|
||||||
|
Multiple patterns can be matched against in one clause using the `|` to separate between each pattern. Only one guard can be added to a clause:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pub fn describe(number: Int) -> String {
|
||||||
|
let yell = True
|
||||||
|
case number {
|
||||||
|
0 -> "Zero"
|
||||||
|
3 | 5 -> "One of the first odd prime numbers"
|
||||||
|
2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
|
||||||
|
i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
|
||||||
|
i if i < 0 -> "Negative number"
|
||||||
|
_ -> "Positive number"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// No compiler error
|
||||||
|
```
|
||||||
|
|
||||||
|
Case expressions will test a value against each pattern from top to bottom, until it finds a matching pattern and executes the logic associated with that pattern. The order of patterns matters!
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
In this exercise, you are playing a number guessing game with a friend. The rules are simple: you secretly choose a number between `1` and `100` and your friend tries to guess what number you've chosen. To help your friend, you respond differently depending on how close the guess was to the number you've chosen (`42`). These are the rules for the different replies:
|
||||||
|
|
||||||
|
- If the guess is `42`: "Correct"
|
||||||
|
- If the guess is `41` or `43`: "So close"
|
||||||
|
- If the guess is less than `41`: "Too low"
|
||||||
|
- If the guess is greater than `43`: "Too high"
|
||||||
|
|
||||||
|
You have four tasks to encode the replies to the guesses.
|
||||||
|
|
||||||
|
## 1. Reply to a correct guess
|
||||||
|
|
||||||
|
Implement the `reply` function to reply to a correct guess:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
reply(42)
|
||||||
|
// -> "Correct"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. Reply to a close guess
|
||||||
|
|
||||||
|
Modify the `reply` function to reply to close guesses:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
reply(41)
|
||||||
|
// -> "So close"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Reply to too low guesses
|
||||||
|
|
||||||
|
Modify the `reply` function to reply to too low guesses:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
reply(25)
|
||||||
|
// -> "Too low"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. Reply to too high guesses
|
||||||
|
|
||||||
|
Modify the `reply` function to reply to too high guesses:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
reply(88)
|
||||||
|
// -> "Too high"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
### Created by
|
||||||
|
|
||||||
|
- @lpil
|
||||||
14
guessing-game/gleam.toml
Normal file
14
guessing-game/gleam.toml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
name = "guessing_game"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
gleam_otp = "~> 0.7 or ~> 1.0"
|
||||||
|
gleam_stdlib = ">= 0.54.0 or ~> 1.0"
|
||||||
|
simplifile = "~> 1.0"
|
||||||
|
gleam_erlang = ">= 0.25.0 and < 1.0.0"
|
||||||
|
gleam_yielder = ">= 1.1.0 and < 2.0.0"
|
||||||
|
gleam_regexp = ">= 1.1.0 and < 2.0.0"
|
||||||
|
gleam_deque = ">= 1.0.0 and < 2.0.0"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
exercism_test_runner = "~> 1.9"
|
||||||
31
guessing-game/manifest.toml
Normal file
31
guessing-game/manifest.toml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# This file was generated by Gleam
|
||||||
|
# You typically do not need to edit this file
|
||||||
|
|
||||||
|
packages = [
|
||||||
|
{ name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" },
|
||||||
|
{ name = "exercism_test_runner", version = "1.9.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 = "0B17BB25F2FF1E60266467C24FE0CA04005410306AA05E9A4B41B1852D72865C" },
|
||||||
|
{ name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" },
|
||||||
|
{ name = "gap", version = "1.1.3", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib"], otp_app = "gap", source = "hex", outer_checksum = "6EF5E3B523FDFBC317E9EA28D5163EE04744A97C007106F90207569789612291" },
|
||||||
|
{ name = "glance", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "E155BA1A787FD11827048355021C0390D2FE9A518485526F631A9D472858CC6D" },
|
||||||
|
{ name = "gleam_community_ansi", version = "1.4.3", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "8A62AE9CC6EA65BEA630D95016D6C07E4F9973565FA3D0DE68DC4200D8E0DD27" },
|
||||||
|
{ name = "gleam_community_colour", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "FDD6AC62C6EC8506C005949A4FCEF032038191D5EAAEC3C9A203CD53AE956ACA" },
|
||||||
|
{ name = "gleam_deque", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_deque", source = "hex", outer_checksum = "64D77068931338CF0D0CB5D37522C3E3CCA7CB7D6C5BACB41648B519CC0133C7" },
|
||||||
|
{ name = "gleam_erlang", version = "0.34.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "0C38F2A128BAA0CEF17C3000BD2097EB80634E239CE31A86400C4416A5D0FDCC" },
|
||||||
|
{ name = "gleam_json", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "C55C5C2B318533A8072D221C5E06E5A75711C129E420DD1CE463342106012E5D" },
|
||||||
|
{ name = "gleam_otp", version = "0.16.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "50DA1539FC8E8FA09924EB36A67A2BBB0AD6B27BCDED5A7EF627057CF69D035E" },
|
||||||
|
{ name = "gleam_regexp", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "7F5E0C0BBEB3C58E57C9CB05FA9002F970C85AD4A63BA1E55CBCB35C15809179" },
|
||||||
|
{ name = "gleam_stdlib", version = "0.55.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "32D8F4AE03771516950047813A9E359249BD9FBA5C33463FDB7B953D6F8E896B" },
|
||||||
|
{ name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" },
|
||||||
|
{ name = "glexer", version = "2.2.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "5C235CBDF4DA5203AD5EAB1D6D8B456ED8162C5424FE2309CFFB7EF438B7C269" },
|
||||||
|
{ name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[requirements]
|
||||||
|
exercism_test_runner = { version = "~> 1.9" }
|
||||||
|
gleam_deque = { version = ">= 1.0.0 and < 2.0.0" }
|
||||||
|
gleam_erlang = { version = ">= 0.25.0 and < 1.0.0" }
|
||||||
|
gleam_otp = { version = "~> 0.7 or ~> 1.0" }
|
||||||
|
gleam_regexp = { version = ">= 1.1.0 and < 2.0.0" }
|
||||||
|
gleam_stdlib = { version = ">= 0.54.0 or ~> 1.0" }
|
||||||
|
gleam_yielder = { version = ">= 1.1.0 and < 2.0.0" }
|
||||||
|
simplifile = { version = "~> 1.0" }
|
||||||
9
guessing-game/src/guessing_game.gleam
Normal file
9
guessing-game/src/guessing_game.gleam
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
pub fn reply(guess: Int) -> String {
|
||||||
|
case guess {
|
||||||
|
i if i < 41 -> "Too low"
|
||||||
|
i if i > 43 -> "Too high"
|
||||||
|
41 | 43 -> "So close"
|
||||||
|
42 -> "Correct"
|
||||||
|
_ -> "WAT"
|
||||||
|
}
|
||||||
|
}
|
||||||
42
guessing-game/test/guessing_game_test.gleam
Normal file
42
guessing-game/test/guessing_game_test.gleam
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import exercism/should
|
||||||
|
import exercism/test_runner
|
||||||
|
import guessing_game
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
test_runner.main()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reply_42_test() {
|
||||||
|
guessing_game.reply(42)
|
||||||
|
|> should.equal("Correct")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reply_41_test() {
|
||||||
|
guessing_game.reply(41)
|
||||||
|
|> should.equal("So close")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reply_43_test() {
|
||||||
|
guessing_game.reply(43)
|
||||||
|
|> should.equal("So close")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reply_40_test() {
|
||||||
|
guessing_game.reply(40)
|
||||||
|
|> should.equal("Too low")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reply_1_test() {
|
||||||
|
guessing_game.reply(1)
|
||||||
|
|> should.equal("Too low")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reply_44_test() {
|
||||||
|
guessing_game.reply(44)
|
||||||
|
|> should.equal("Too high")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reply_100_test() {
|
||||||
|
guessing_game.reply(100)
|
||||||
|
|> should.equal("Too high")
|
||||||
|
}
|
||||||
24
log-levels/.exercism/config.json
Normal file
24
log-levels/.exercism/config.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"lpil"
|
||||||
|
],
|
||||||
|
"files": {
|
||||||
|
"solution": [
|
||||||
|
"src/log_levels.gleam"
|
||||||
|
],
|
||||||
|
"test": [
|
||||||
|
"test/log_levels_test.gleam"
|
||||||
|
],
|
||||||
|
"exemplar": [
|
||||||
|
".meta/example.gleam"
|
||||||
|
],
|
||||||
|
"invalidator": [
|
||||||
|
"gleam.toml",
|
||||||
|
"manifest.toml"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forked_from": [
|
||||||
|
"elixir/log-levels"
|
||||||
|
],
|
||||||
|
"blurb": "Learn about strings by parsing application logs"
|
||||||
|
}
|
||||||
1
log-levels/.exercism/metadata.json
Normal file
1
log-levels/.exercism/metadata.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"track":"gleam","exercise":"log-levels","id":"f238520169aa480db7cbc9a970d0111d","url":"https://exercism.org/tracks/gleam/exercises/log-levels","handle":"limpit","is_requester":true,"auto_approve":false}
|
||||||
4
log-levels/.gitignore
vendored
Normal file
4
log-levels/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
*.beam
|
||||||
|
*.ez
|
||||||
|
build
|
||||||
|
erl_crash.dump
|
||||||
32
log-levels/HELP.md
Normal file
32
log-levels/HELP.md
Normal file
@@ -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/log_levels.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.
|
||||||
22
log-levels/HINTS.md
Normal file
22
log-levels/HINTS.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Hints
|
||||||
|
|
||||||
|
## General
|
||||||
|
|
||||||
|
- The `gleam/string` module has many useful [string functions][stdlib].
|
||||||
|
|
||||||
|
## 1. Get message from a log line
|
||||||
|
|
||||||
|
- The `<>` operator can be used in pattern matching to match the beginning of a string.
|
||||||
|
- The `gleam/string` module has a [function][trim] to remove surrounding whitespace from a string.
|
||||||
|
|
||||||
|
## 2. Get log level from a log line
|
||||||
|
|
||||||
|
- The `gleam/string` module has a [function][lowercase] to convert a string to lowercase.
|
||||||
|
|
||||||
|
## 3. Reformat a log line
|
||||||
|
|
||||||
|
- The `<>` operator can be used to join strings together.
|
||||||
|
|
||||||
|
[stdlib]: https://hexdocs.pm/gleam_stdlib/gleam/string.html
|
||||||
|
[trim]: https://hexdocs.pm/gleam_stdlib/gleam/string.html#trim
|
||||||
|
[lowercase]: https://hexdocs.pm/gleam_stdlib/gleam/string.html#lowercase
|
||||||
108
log-levels/README.md
Normal file
108
log-levels/README.md
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
# Log Levels
|
||||||
|
|
||||||
|
Welcome to Log Levels on Exercism's Gleam Track.
|
||||||
|
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||||
|
If you get stuck on the exercise, check out `HINTS.md`, but try and solve it without using those first :)
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
## Strings
|
||||||
|
|
||||||
|
Strings in Gleam are immutable text surrounded by double quotes. They support unicode characters, and can be multi-line.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
let greeting = "Hello, Joe! 📞"
|
||||||
|
|
||||||
|
let multi_line_string = "one
|
||||||
|
two
|
||||||
|
three"
|
||||||
|
```
|
||||||
|
|
||||||
|
Strings can be joined together using the `<>` operator:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
let name = "Mike"
|
||||||
|
"Hello, " <> name <> "!"
|
||||||
|
// -> "Hello, Mike!"
|
||||||
|
```
|
||||||
|
|
||||||
|
The [`gleam/string`][stdlib] module in the standard library provides functions for working with strings.
|
||||||
|
|
||||||
|
Strings can be matched upon in case expressions:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pub fn on_an_excellent_adventure(name: String) -> Bool {
|
||||||
|
case name {
|
||||||
|
"Bill" -> True
|
||||||
|
"Ted" -> True
|
||||||
|
_ -> False
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to match on the beginning of a string and assign the rest to a variable you can use the `<>` operator pattern:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pub fn profession(name: String) -> String {
|
||||||
|
case name {
|
||||||
|
"Dr " <> rest -> rest <> " is a doctor"
|
||||||
|
_ -> "I'm not sure what " <> name <> " does"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[stdlib]: https://hexdocs.pm/gleam_stdlib/gleam/string.html
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
In this exercise you'll be processing log-lines.
|
||||||
|
|
||||||
|
Each log line is a string formatted as follows: `"[<LEVEL>]: <MESSAGE>"`.
|
||||||
|
|
||||||
|
There are three different log levels:
|
||||||
|
|
||||||
|
- `INFO`
|
||||||
|
- `WARNING`
|
||||||
|
- `ERROR`
|
||||||
|
|
||||||
|
You have three tasks, each of which will take a log line and ask you to do something with it.
|
||||||
|
|
||||||
|
## 1. Get message from a log line
|
||||||
|
|
||||||
|
Implement the `message` function to return a log line's message:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
message("[ERROR]: Invalid operation")
|
||||||
|
// -> "Invalid operation"
|
||||||
|
```
|
||||||
|
|
||||||
|
Any leading or trailing white space should be removed:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
message("[WARNING]: Disk almost full\r\n")
|
||||||
|
// -> "Disk almost full"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. Get log level from a log line
|
||||||
|
|
||||||
|
Implement the `log_level` function to return a log line's log level, which should be returned in lowercase:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
log_level("[ERROR]: Invalid operation")
|
||||||
|
// -> "error"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Reformat a log line
|
||||||
|
|
||||||
|
Implement the `reformat` function that reformats the log line, putting the message first and the log level after it in parentheses:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
reformat("[INFO]: Operation completed")
|
||||||
|
// -> "Operation completed (info)"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
### Created by
|
||||||
|
|
||||||
|
- @lpil
|
||||||
14
log-levels/gleam.toml
Normal file
14
log-levels/gleam.toml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
name = "log_levels"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
gleam_otp = "~> 0.7 or ~> 1.0"
|
||||||
|
gleam_stdlib = ">= 0.54.0 or ~> 1.0"
|
||||||
|
simplifile = "~> 1.0"
|
||||||
|
gleam_erlang = ">= 0.25.0 and < 1.0.0"
|
||||||
|
gleam_yielder = ">= 1.1.0 and < 2.0.0"
|
||||||
|
gleam_regexp = ">= 1.1.0 and < 2.0.0"
|
||||||
|
gleam_deque = ">= 1.0.0 and < 2.0.0"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
exercism_test_runner = "~> 1.9"
|
||||||
31
log-levels/manifest.toml
Normal file
31
log-levels/manifest.toml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# This file was generated by Gleam
|
||||||
|
# You typically do not need to edit this file
|
||||||
|
|
||||||
|
packages = [
|
||||||
|
{ name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" },
|
||||||
|
{ name = "exercism_test_runner", version = "1.9.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 = "0B17BB25F2FF1E60266467C24FE0CA04005410306AA05E9A4B41B1852D72865C" },
|
||||||
|
{ name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" },
|
||||||
|
{ name = "gap", version = "1.1.3", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib"], otp_app = "gap", source = "hex", outer_checksum = "6EF5E3B523FDFBC317E9EA28D5163EE04744A97C007106F90207569789612291" },
|
||||||
|
{ name = "glance", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "E155BA1A787FD11827048355021C0390D2FE9A518485526F631A9D472858CC6D" },
|
||||||
|
{ name = "gleam_community_ansi", version = "1.4.3", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "8A62AE9CC6EA65BEA630D95016D6C07E4F9973565FA3D0DE68DC4200D8E0DD27" },
|
||||||
|
{ name = "gleam_community_colour", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "FDD6AC62C6EC8506C005949A4FCEF032038191D5EAAEC3C9A203CD53AE956ACA" },
|
||||||
|
{ name = "gleam_deque", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_deque", source = "hex", outer_checksum = "64D77068931338CF0D0CB5D37522C3E3CCA7CB7D6C5BACB41648B519CC0133C7" },
|
||||||
|
{ name = "gleam_erlang", version = "0.34.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "0C38F2A128BAA0CEF17C3000BD2097EB80634E239CE31A86400C4416A5D0FDCC" },
|
||||||
|
{ name = "gleam_json", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "C55C5C2B318533A8072D221C5E06E5A75711C129E420DD1CE463342106012E5D" },
|
||||||
|
{ name = "gleam_otp", version = "0.16.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "50DA1539FC8E8FA09924EB36A67A2BBB0AD6B27BCDED5A7EF627057CF69D035E" },
|
||||||
|
{ name = "gleam_regexp", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "7F5E0C0BBEB3C58E57C9CB05FA9002F970C85AD4A63BA1E55CBCB35C15809179" },
|
||||||
|
{ name = "gleam_stdlib", version = "0.55.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "32D8F4AE03771516950047813A9E359249BD9FBA5C33463FDB7B953D6F8E896B" },
|
||||||
|
{ name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" },
|
||||||
|
{ name = "glexer", version = "2.2.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "5C235CBDF4DA5203AD5EAB1D6D8B456ED8162C5424FE2309CFFB7EF438B7C269" },
|
||||||
|
{ name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[requirements]
|
||||||
|
exercism_test_runner = { version = "~> 1.9" }
|
||||||
|
gleam_deque = { version = ">= 1.0.0 and < 2.0.0" }
|
||||||
|
gleam_erlang = { version = ">= 0.25.0 and < 1.0.0" }
|
||||||
|
gleam_otp = { version = "~> 0.7 or ~> 1.0" }
|
||||||
|
gleam_regexp = { version = ">= 1.1.0 and < 2.0.0" }
|
||||||
|
gleam_stdlib = { version = ">= 0.54.0 or ~> 1.0" }
|
||||||
|
gleam_yielder = { version = ">= 1.1.0 and < 2.0.0" }
|
||||||
|
simplifile = { version = "~> 1.0" }
|
||||||
24
log-levels/src/log_levels.gleam
Normal file
24
log-levels/src/log_levels.gleam
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import gleam/io
|
||||||
|
import gleam/string
|
||||||
|
|
||||||
|
pub fn message(log_line: String) -> String {
|
||||||
|
case log_line {
|
||||||
|
"[ERROR]: " <> message -> message
|
||||||
|
"[WARNING]: " <> message -> message
|
||||||
|
"[INFO]:" <> message -> message
|
||||||
|
_ -> log_line
|
||||||
|
}
|
||||||
|
|> string.trim
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn log_level(log_line: String) -> String {
|
||||||
|
case log_line {
|
||||||
|
"[ERROR]" <> _ -> "error"
|
||||||
|
"[WARNING]" <> _ -> "warning"
|
||||||
|
_ -> "info"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reformat(log_line: String) -> String {
|
||||||
|
message(log_line) <> " (" <> log_level(log_line) <> ")"
|
||||||
|
}
|
||||||
62
log-levels/test/log_levels_test.gleam
Normal file
62
log-levels/test/log_levels_test.gleam
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
import exercism/should
|
||||||
|
import exercism/test_runner
|
||||||
|
import log_levels
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
test_runner.main()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn error_message_test() {
|
||||||
|
log_levels.message("[ERROR]: Stack overflow")
|
||||||
|
|> should.equal("Stack overflow")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn warning_message_test() {
|
||||||
|
log_levels.message("[WARNING]: Disk almost full")
|
||||||
|
|> should.equal("Disk almost full")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn info_message_test() {
|
||||||
|
log_levels.message("[INFO]: File moved")
|
||||||
|
|> should.equal("File moved")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn message_with_leading_and_trailing_white_space_test() {
|
||||||
|
log_levels.message("[WARNING]: \tTimezone not set \r\n")
|
||||||
|
|> should.equal("Timezone not set")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn error_log_level_test() {
|
||||||
|
log_levels.log_level("[ERROR]: Disk full")
|
||||||
|
|> should.equal("error")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn warning_log_level_test() {
|
||||||
|
log_levels.log_level("[WARNING]: Unsafe password")
|
||||||
|
|> should.equal("warning")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn info_log_level_test() {
|
||||||
|
log_levels.log_level("[INFO]: Timezone changed")
|
||||||
|
|> should.equal("info")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn error_reformat_test() {
|
||||||
|
log_levels.reformat("[ERROR]: Segmentation fault")
|
||||||
|
|> should.equal("Segmentation fault (error)")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn warning_reformat_test() {
|
||||||
|
log_levels.reformat("[WARNING]: Decreased performance")
|
||||||
|
|> should.equal("Decreased performance (warning)")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn info_reformat_test() {
|
||||||
|
log_levels.reformat("[INFO]: Disk defragmented")
|
||||||
|
|> should.equal("Disk defragmented (info)")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reformat_with_leading_and_trailing_white_space_test() {
|
||||||
|
log_levels.reformat("[ERROR]: \t Corrupt disk\t \t \r\n")
|
||||||
|
|> should.equal("Corrupt disk (error)")
|
||||||
|
}
|
||||||
24
valentines-day/.exercism/config.json
Normal file
24
valentines-day/.exercism/config.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"lpil"
|
||||||
|
],
|
||||||
|
"files": {
|
||||||
|
"solution": [
|
||||||
|
"src/valentines_day.gleam"
|
||||||
|
],
|
||||||
|
"test": [
|
||||||
|
"test/valentines_day_test.gleam"
|
||||||
|
],
|
||||||
|
"exemplar": [
|
||||||
|
".meta/example.gleam"
|
||||||
|
],
|
||||||
|
"invalidator": [
|
||||||
|
"gleam.toml",
|
||||||
|
"manifest.toml"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"forked_from": [
|
||||||
|
"fsharp/valentines_day"
|
||||||
|
],
|
||||||
|
"blurb": "Learn usage of Custom Types while deciding what to do for Valentines Day"
|
||||||
|
}
|
||||||
1
valentines-day/.exercism/metadata.json
Normal file
1
valentines-day/.exercism/metadata.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"track":"gleam","exercise":"valentines-day","id":"fdb62dff5ce84d2e8104377c5b48f2ac","url":"https://exercism.org/tracks/gleam/exercises/valentines-day","handle":"limpit","is_requester":true,"auto_approve":false}
|
||||||
4
valentines-day/.gitignore
vendored
Normal file
4
valentines-day/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
*.beam
|
||||||
|
*.ez
|
||||||
|
build
|
||||||
|
erl_crash.dump
|
||||||
32
valentines-day/HELP.md
Normal file
32
valentines-day/HELP.md
Normal file
@@ -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/valentines_day.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.
|
||||||
14
valentines-day/HINTS.md
Normal file
14
valentines-day/HINTS.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Hints
|
||||||
|
|
||||||
|
## 1. Define the approval
|
||||||
|
|
||||||
|
- Custom types can be defined using the `pub type Name { Variant1 }` syntax.
|
||||||
|
|
||||||
|
## 4. Define the activity
|
||||||
|
|
||||||
|
- Custom types containing data can be defined using the `pub type Name { Variant1(SomeType) }` syntax.
|
||||||
|
|
||||||
|
## 5. Rate the activity
|
||||||
|
|
||||||
|
- Custom type variants can be pattern matched on using case expressions.
|
||||||
|
- If you want to add an additional condition to a pattern, you can add a guard to the pattern using the `if` keyword.
|
||||||
128
valentines-day/README.md
Normal file
128
valentines-day/README.md
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# Valentine's Day
|
||||||
|
|
||||||
|
Welcome to Valentine's Day on Exercism's Gleam Track.
|
||||||
|
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||||
|
If you get stuck on the exercise, check out `HINTS.md`, but try and solve it without using those first :)
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
## Custom Types
|
||||||
|
|
||||||
|
Custom Types are how new data types are defined in Gleam. They can have multiple _variants_, each with their own name.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pub type Season {
|
||||||
|
Spring
|
||||||
|
Summer
|
||||||
|
Autumn
|
||||||
|
Winter
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Each case of a custom type can optionally hold some data, and different cases can have different types of data. When a variant holds data it is called a _record_.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
pub type Number {
|
||||||
|
SomeInt(Int)
|
||||||
|
SomeFloat(Float)
|
||||||
|
Invalid
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Creating a value for a specific case can be done by referring to its name if it contains no additional data (`Spring`), or by calling it as a function if it does (`SomeInt(2)`).
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
let spring = Spring
|
||||||
|
let integerTwo = SomeInt(2)
|
||||||
|
```
|
||||||
|
|
||||||
|
Custom types, along with everything in Gleam, have _structural equality_, which means that two values of the same variant and with the same data are equivalent.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
Spring == Spring // -> True
|
||||||
|
Spring == Autumn // -> False
|
||||||
|
SomeInt(2) == SomeInt(2) // -> True
|
||||||
|
SomeInt(2) == SomeFloat(2.0) // -> False
|
||||||
|
```
|
||||||
|
|
||||||
|
Custom type variants can be pattern matched on using case expressions.
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
import gleam/int
|
||||||
|
import gleam/float
|
||||||
|
|
||||||
|
pub fn describe(flexible_number: Number) -> String {
|
||||||
|
case flexible_number {
|
||||||
|
SomeFloat(f) -> "Float: " <> float.to_string(f)
|
||||||
|
SomeInt(i) -> "Int: " <> int.to_string(i)
|
||||||
|
Invalid -> "Neither a float nor an int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
In this exercise, it's Valentine's day and you and your partner are planning on doing something nice together. Your partner has lots of ideas, and is now asking you to rate the ideas, in order to find the activity to engage in.
|
||||||
|
|
||||||
|
The following ideas are proposed by your partner:
|
||||||
|
|
||||||
|
- Playing a board game
|
||||||
|
- Chill out
|
||||||
|
- Watch a movie
|
||||||
|
- Go to a restaurant
|
||||||
|
- Take a walk
|
||||||
|
|
||||||
|
You have six tasks to help choose your Valentine's day activity.
|
||||||
|
|
||||||
|
## 1. Define the approval
|
||||||
|
|
||||||
|
For each idea your partner proposes, you respond with one of three options: yes, no or maybe.
|
||||||
|
|
||||||
|
Define the `Approval` custom type to represent these options as the following three cases: `Yes`, `No` and `Maybe`.
|
||||||
|
|
||||||
|
## 2. Define the cuisines
|
||||||
|
|
||||||
|
Your partner has selected two possible restaurants: one based on the Korean cuisine and the other based on the Turkish cuisine.
|
||||||
|
|
||||||
|
Define the `Cuisine` custom type to represent these cuisines as the following two cases: `Korean` and `Turkish`.
|
||||||
|
|
||||||
|
## 3. Define the movie genres
|
||||||
|
|
||||||
|
There are tons of movies to choose from, so to narrow things down, your partner also lists their genre.
|
||||||
|
|
||||||
|
Define the `Genre` custom type to represent the following genres as cases: `Crime`, `Horror`, `Romance` and `Thriller`.
|
||||||
|
|
||||||
|
## 4. Define the activity
|
||||||
|
|
||||||
|
As said, your partner has come up with five different activities: playing a board game, chill out, watch a movie, go to a restaurant and taking a walk.
|
||||||
|
|
||||||
|
Define the `Activity` custom type to represent these activity types:
|
||||||
|
|
||||||
|
- `BoardGame`: no associated data.
|
||||||
|
- `Chill`: no associated data.
|
||||||
|
- `Movie`: has its `Genre` as associated data.
|
||||||
|
- `Restaurant`: has its `Cuisine` as associated data.
|
||||||
|
- `Walk`: has an `Int` representing the number of kilometers to walk as associated data.
|
||||||
|
|
||||||
|
## 5. Rate the activity
|
||||||
|
|
||||||
|
Finally, you're ready to rate your partner's ideas. This is how you feel about your partner's idea:
|
||||||
|
|
||||||
|
- Playing a board game: no.
|
||||||
|
- Chill out: no.
|
||||||
|
- Watch a movie: yes if it is a romantic movie; otherwise, no.
|
||||||
|
- Go to a restaurant: yes if the cuisine is Korean, maybe if it is Turkish.
|
||||||
|
- Take a walk: yes if the walk is more than eleven kilometers; maybe if it is more than six kilometers; otherwise, no.
|
||||||
|
|
||||||
|
Implement a function named `rate_activity` that takes an `Activity` value and returns the `Approval` based on the above sentiments:
|
||||||
|
|
||||||
|
```gleam
|
||||||
|
rate_activity(Restaurant(Turkish))
|
||||||
|
// -> Maybe
|
||||||
|
```
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
### Created by
|
||||||
|
|
||||||
|
- @lpil
|
||||||
14
valentines-day/gleam.toml
Normal file
14
valentines-day/gleam.toml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
name = "valentines_day"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
gleam_otp = "~> 0.7 or ~> 1.0"
|
||||||
|
gleam_stdlib = ">= 0.54.0 or ~> 1.0"
|
||||||
|
simplifile = "~> 1.0"
|
||||||
|
gleam_erlang = ">= 0.25.0 and < 1.0.0"
|
||||||
|
gleam_yielder = ">= 1.1.0 and < 2.0.0"
|
||||||
|
gleam_regexp = ">= 1.1.0 and < 2.0.0"
|
||||||
|
gleam_deque = ">= 1.0.0 and < 2.0.0"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
exercism_test_runner = "~> 1.9"
|
||||||
31
valentines-day/manifest.toml
Normal file
31
valentines-day/manifest.toml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# This file was generated by Gleam
|
||||||
|
# You typically do not need to edit this file
|
||||||
|
|
||||||
|
packages = [
|
||||||
|
{ name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" },
|
||||||
|
{ name = "exercism_test_runner", version = "1.9.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 = "0B17BB25F2FF1E60266467C24FE0CA04005410306AA05E9A4B41B1852D72865C" },
|
||||||
|
{ name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" },
|
||||||
|
{ name = "gap", version = "1.1.3", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib"], otp_app = "gap", source = "hex", outer_checksum = "6EF5E3B523FDFBC317E9EA28D5163EE04744A97C007106F90207569789612291" },
|
||||||
|
{ name = "glance", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "E155BA1A787FD11827048355021C0390D2FE9A518485526F631A9D472858CC6D" },
|
||||||
|
{ name = "gleam_community_ansi", version = "1.4.3", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "8A62AE9CC6EA65BEA630D95016D6C07E4F9973565FA3D0DE68DC4200D8E0DD27" },
|
||||||
|
{ name = "gleam_community_colour", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "FDD6AC62C6EC8506C005949A4FCEF032038191D5EAAEC3C9A203CD53AE956ACA" },
|
||||||
|
{ name = "gleam_deque", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_deque", source = "hex", outer_checksum = "64D77068931338CF0D0CB5D37522C3E3CCA7CB7D6C5BACB41648B519CC0133C7" },
|
||||||
|
{ name = "gleam_erlang", version = "0.34.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "0C38F2A128BAA0CEF17C3000BD2097EB80634E239CE31A86400C4416A5D0FDCC" },
|
||||||
|
{ name = "gleam_json", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "C55C5C2B318533A8072D221C5E06E5A75711C129E420DD1CE463342106012E5D" },
|
||||||
|
{ name = "gleam_otp", version = "0.16.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "50DA1539FC8E8FA09924EB36A67A2BBB0AD6B27BCDED5A7EF627057CF69D035E" },
|
||||||
|
{ name = "gleam_regexp", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "7F5E0C0BBEB3C58E57C9CB05FA9002F970C85AD4A63BA1E55CBCB35C15809179" },
|
||||||
|
{ name = "gleam_stdlib", version = "0.55.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "32D8F4AE03771516950047813A9E359249BD9FBA5C33463FDB7B953D6F8E896B" },
|
||||||
|
{ name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" },
|
||||||
|
{ name = "glexer", version = "2.2.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "5C235CBDF4DA5203AD5EAB1D6D8B456ED8162C5424FE2309CFFB7EF438B7C269" },
|
||||||
|
{ name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[requirements]
|
||||||
|
exercism_test_runner = { version = "~> 1.9" }
|
||||||
|
gleam_deque = { version = ">= 1.0.0 and < 2.0.0" }
|
||||||
|
gleam_erlang = { version = ">= 0.25.0 and < 1.0.0" }
|
||||||
|
gleam_otp = { version = "~> 0.7 or ~> 1.0" }
|
||||||
|
gleam_regexp = { version = ">= 1.1.0 and < 2.0.0" }
|
||||||
|
gleam_stdlib = { version = ">= 0.54.0 or ~> 1.0" }
|
||||||
|
gleam_yielder = { version = ">= 1.1.0 and < 2.0.0" }
|
||||||
|
simplifile = { version = "~> 1.0" }
|
||||||
36
valentines-day/src/valentines_day.gleam
Normal file
36
valentines-day/src/valentines_day.gleam
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
pub type Approval {
|
||||||
|
Yes
|
||||||
|
No
|
||||||
|
Maybe
|
||||||
|
}
|
||||||
|
|
||||||
|
pub type Cuisine {
|
||||||
|
Korean
|
||||||
|
Turkish
|
||||||
|
}
|
||||||
|
|
||||||
|
pub type Genre {
|
||||||
|
Crime
|
||||||
|
Horror
|
||||||
|
Romance
|
||||||
|
Thriller
|
||||||
|
}
|
||||||
|
|
||||||
|
pub type Activity {
|
||||||
|
BoardGame
|
||||||
|
Chill
|
||||||
|
Movie(Genre)
|
||||||
|
Restaurant(Cuisine)
|
||||||
|
Walk(Int)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_activity(activity: Activity) -> Approval {
|
||||||
|
case activity {
|
||||||
|
Movie(Romance) -> Yes
|
||||||
|
Restaurant(Turkish) -> Maybe
|
||||||
|
Restaurant(Korean) -> Yes
|
||||||
|
Walk(i) if i > 11 -> Yes
|
||||||
|
Walk(i) if i > 6 -> Maybe
|
||||||
|
_ -> No
|
||||||
|
}
|
||||||
|
}
|
||||||
75
valentines-day/test/valentines_day_test.gleam
Normal file
75
valentines-day/test/valentines_day_test.gleam
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
import exercism/should
|
||||||
|
import exercism/test_runner
|
||||||
|
import valentines_day.{
|
||||||
|
BoardGame, Chill, Crime, Horror, Korean, Maybe, Movie, No, Restaurant, Romance,
|
||||||
|
Thriller, Turkish, Walk, Yes,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
test_runner.main()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_board_game_test() {
|
||||||
|
valentines_day.rate_activity(BoardGame)
|
||||||
|
|> should.equal(No)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_chilling_test() {
|
||||||
|
valentines_day.rate_activity(Chill)
|
||||||
|
|> should.equal(No)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_crime_movie_test() {
|
||||||
|
valentines_day.rate_activity(Movie(Crime))
|
||||||
|
|> should.equal(No)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_horror_movie_test() {
|
||||||
|
valentines_day.rate_activity(Movie(Horror))
|
||||||
|
|> should.equal(No)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_romance_movie_test() {
|
||||||
|
valentines_day.rate_activity(Movie(Romance))
|
||||||
|
|> should.equal(Yes)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_thriller_movie_test() {
|
||||||
|
valentines_day.rate_activity(Movie(Thriller))
|
||||||
|
|> should.equal(No)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_korean_restaurant_test() {
|
||||||
|
valentines_day.rate_activity(Restaurant(Korean))
|
||||||
|
|> should.equal(Yes)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_turkish_restaurant_test() {
|
||||||
|
valentines_day.rate_activity(Restaurant(Turkish))
|
||||||
|
|> should.equal(Maybe)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_walk_of_12_kilometer_test() {
|
||||||
|
valentines_day.rate_activity(Walk(12))
|
||||||
|
|> should.equal(Yes)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_walk_of_13_kilometers_test() {
|
||||||
|
valentines_day.rate_activity(Walk(13))
|
||||||
|
|> should.equal(Yes)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_walk_of_11_kilometers_test() {
|
||||||
|
valentines_day.rate_activity(Walk(11))
|
||||||
|
|> should.equal(Maybe)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_walk_of_7_kilometers_test() {
|
||||||
|
valentines_day.rate_activity(Walk(7))
|
||||||
|
|> should.equal(Maybe)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rate_walk_of_6_kilometers_test() {
|
||||||
|
valentines_day.rate_activity(Walk(6))
|
||||||
|
|> should.equal(No)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user