-
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
8 changed files
with
298 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/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. |
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,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 |
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,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_pence`. | ||
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 |
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,11 @@ | ||
name = "bettys_bike_shop" | ||
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" | ||
|
||
[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,26 @@ | ||
# 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.24.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "26BDB52E61889F56A291CB34167315780EE4AA20961917314446542C90D1C1A0" }, | ||
{ 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_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,10 @@ | ||
import gleam/int | ||
import gleam/float | ||
|
||
pub fn pence_to_pounds(pence) -> Float { | ||
int.to_float(pence) /. 100.0 | ||
} | ||
|
||
pub fn pounds_to_string(pounds) -> String { | ||
"£" <> float.to_string(pounds) | ||
} |
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 @@ | ||
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") | ||
} |