feat(gleam): lasagna
Signed-off-by: Christina Sørensen <christina@cafkafk.com>
This commit is contained in:
parent
dc144ea2a4
commit
0477a1d952
10 changed files with 344 additions and 0 deletions
24
gleam/lasagna/.exercism/config.json
Normal file
24
gleam/lasagna/.exercism/config.json
Normal file
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"authors": [
|
||||
"lpil"
|
||||
],
|
||||
"files": {
|
||||
"solution": [
|
||||
"src/lasagna.gleam"
|
||||
],
|
||||
"test": [
|
||||
"test/lasagna_test.gleam"
|
||||
],
|
||||
"exemplar": [
|
||||
".meta/example.gleam"
|
||||
],
|
||||
"invalidator": [
|
||||
"gleam.toml",
|
||||
"manifest.toml"
|
||||
]
|
||||
},
|
||||
"forked_from": [
|
||||
"elixir/lasagna"
|
||||
],
|
||||
"blurb": "Learn about the basics of Gleam by following a lasagna recipe."
|
||||
}
|
1
gleam/lasagna/.exercism/metadata.json
Normal file
1
gleam/lasagna/.exercism/metadata.json
Normal file
|
@ -0,0 +1 @@
|
|||
{"track":"gleam","exercise":"lasagna","id":"fdb8beccbeed44489ba0ae1da3b8d88e","url":"https://exercism.org/tracks/gleam/exercises/lasagna","handle":"cafkafk","is_requester":true,"auto_approve":false}
|
4
gleam/lasagna/.gitignore
vendored
Normal file
4
gleam/lasagna/.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
*.beam
|
||||
*.ez
|
||||
build
|
||||
erl_crash.dump
|
32
gleam/lasagna/HELP.md
Normal file
32
gleam/lasagna/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/lasagna.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.
|
42
gleam/lasagna/HINTS.md
Normal file
42
gleam/lasagna/HINTS.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
# Hints
|
||||
|
||||
## General
|
||||
|
||||
- An [int value][ints] can be defined as one or more consecutive digits.
|
||||
- [String][string] literals are a sequence of characters surrounded by double quotes.
|
||||
|
||||
## 1. Define the expected oven time in minutes
|
||||
|
||||
- You need to define a [function][functions] without any arguments.
|
||||
- You need to return an [int][ints].
|
||||
|
||||
## 2. Calculate the remaining oven time in minutes
|
||||
|
||||
- You need to define a [function][functions] with a single argument.
|
||||
- You have to return an int from a function.
|
||||
- The function's argument is an [int][ints].
|
||||
- You can use the [mathematical operator for subtraction][ints] to subtract values.
|
||||
|
||||
## 3. Calculate the preparation time in minutes
|
||||
|
||||
- You need to define a [function][functions] with a single argument.
|
||||
- You have to return an int from a function.
|
||||
- The function's argument is an [int][ints].
|
||||
- You can use the [mathematical operator for multiplication][ints] to multiply values.
|
||||
|
||||
## 4. Calculate the total working time in minutes
|
||||
|
||||
- You need to define a [function][functions] with two arguments.
|
||||
- You have to return an int from a function.
|
||||
- The function's argument is an [int][ints].
|
||||
- You can invoke one of the other functions you've defined previously.
|
||||
- You can use the [mathematical operator for addition][ints] to add values.
|
||||
|
||||
## 5. Create a notification that the lasagna is ready
|
||||
|
||||
- You need to define a [function][functions] without any arguments.
|
||||
- You need to return a [string][string].
|
||||
|
||||
[functions]: https://gleam.run/book/tour/functions.html
|
||||
[ints]: https://gleam.run/book/tour/ints-and-floats.html
|
||||
[string]: https://gleam.run/book/tour/strings.html
|
134
gleam/lasagna/README.md
Normal file
134
gleam/lasagna/README.md
Normal file
|
@ -0,0 +1,134 @@
|
|||
# Lasagna
|
||||
|
||||
Welcome to Lasagna 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
|
||||
|
||||
## Basics
|
||||
|
||||
### Functions
|
||||
|
||||
In Gleam functions are defined using the `pub fn` syntax.
|
||||
|
||||
```gleam
|
||||
pub fn add(x: Int, y: Int) -> Int {
|
||||
x + y
|
||||
}
|
||||
```
|
||||
|
||||
This function takes two arguments, both of type `Int`, and returns a value of type `Int`. There is no `return` keyword in Gleam, the value of the last expression in a function is always _implicitly returned_.
|
||||
|
||||
The type annotations for arguments and the return type are optional, and Gleam will always fully type check your code. Typically Gleam programmers will give their functions type annotations for clarity, but you may omit them if you wish.
|
||||
|
||||
```gleam
|
||||
pub fn add(x, y) {
|
||||
x + y
|
||||
}
|
||||
```
|
||||
|
||||
A function can be called using the `function_name(argument1, argument2)` syntax.
|
||||
|
||||
```gleam
|
||||
pub fn double(x: Int) -> Int {
|
||||
// Call the add function defined above
|
||||
add(x, x)
|
||||
}
|
||||
```
|
||||
|
||||
### Variables
|
||||
|
||||
In Gleam variables are defined using the `let name = expression` syntax.
|
||||
|
||||
```gleam
|
||||
pub fn main() {
|
||||
let count = 1
|
||||
}
|
||||
```
|
||||
|
||||
Variables can be declared with type annotations. Like function arguments these are optional, though most Gleam programmers will omit type annotations for variables for brevity.
|
||||
|
||||
```gleam
|
||||
pub fn main() {
|
||||
let count: Int = 1
|
||||
}
|
||||
```
|
||||
|
||||
### String literals
|
||||
|
||||
In Gleam strings are written using double quotes.
|
||||
|
||||
```gleam
|
||||
pub fn greeting() {
|
||||
"Hello, world!"
|
||||
}
|
||||
```
|
||||
|
||||
### Code comments
|
||||
|
||||
Comments can be used to leave notes for other developers reading the source code. Comments in Gleam are single lines preceeded by `//`.
|
||||
|
||||
```gleam
|
||||
pub fn main() {
|
||||
// This is a comment
|
||||
let x = 1
|
||||
}
|
||||
```
|
||||
|
||||
## Instructions
|
||||
|
||||
In this exercise you're going to write some code to help you cook a brilliant lasagna from your favorite cooking book.
|
||||
|
||||
You have five tasks, all related to the time spent cooking the lasagna.
|
||||
|
||||
## 1. Define the expected oven time in minutes
|
||||
|
||||
Define the `expected_minutes_in_oven` function that does not take any arguments and returns how many minutes the lasagna should be in the oven. According to the cooking book, the expected oven time in minutes is 40:
|
||||
|
||||
```gleam
|
||||
expected_minutes_in_oven()
|
||||
// -> 40
|
||||
```
|
||||
|
||||
## 2. Calculate the remaining oven time in minutes
|
||||
|
||||
Define the `remaining_minutes_in_oven` function that takes the actual minutes the lasagna has been in the oven as an argument and returns how many minutes the lasagna still has to remain in the oven, based on the expected oven time in minutes from the previous task.
|
||||
|
||||
```gleam
|
||||
remaining_minutes_in_oven(30)
|
||||
// -> 10
|
||||
```
|
||||
|
||||
## 3. Calculate the preparation time in minutes
|
||||
|
||||
Define the `preparation_time_in_minutes` function that takes the number of layers you added to the lasagna as an argument and returns how many minutes you spent preparing the lasagna, assuming each layer takes you 2 minutes to prepare.
|
||||
|
||||
```gleam
|
||||
preparation_time_in_minutes(2)
|
||||
// -> 4
|
||||
```
|
||||
|
||||
## 4. Calculate the total working time in minutes
|
||||
|
||||
Define the `total_time_in_minutes` function that takes two arguments: the first argument is the number of layers you added to the lasagna, and the second argument is the number of minutes the lasagna has been in the oven. The function should return how many minutes in total you've worked on cooking the lasagna, which is the sum of the preparation time in minutes, and the time in minutes the lasagna has spent in the oven at the moment.
|
||||
|
||||
```gleam
|
||||
total_time_in_minutes(3, 10)
|
||||
// -> 16
|
||||
```
|
||||
|
||||
## 5. Create a notification that the lasagna is ready
|
||||
|
||||
Define the `alarm` function that does not take any arguments and returns a message indicating that the lasagna is ready to eat.
|
||||
|
||||
```gleam
|
||||
alarm()
|
||||
// -> "Ding!"
|
||||
```
|
||||
|
||||
## Source
|
||||
|
||||
### Created by
|
||||
|
||||
- @lpil
|
12
gleam/lasagna/gleam.toml
Normal file
12
gleam/lasagna/gleam.toml
Normal file
|
@ -0,0 +1,12 @@
|
|||
name = "lasagna"
|
||||
version = "0.1.0"
|
||||
|
||||
[dependencies]
|
||||
gleam_bitwise = "~> 1.2"
|
||||
gleam_otp = "~> 0.7 or ~> 1.0"
|
||||
gleam_stdlib = "~> 0.32 or ~> 1.0"
|
||||
simplifile = "~> 1.0"
|
||||
gleam_erlang = ">= 0.25.0 and < 1.0.0"
|
||||
|
||||
[dev-dependencies]
|
||||
exercism_test_runner = "~> 1.4"
|
28
gleam/lasagna/manifest.toml
Normal file
28
gleam/lasagna/manifest.toml
Normal file
|
@ -0,0 +1,28 @@
|
|||
# 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.8.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 = "B944D89A9D049897DF28C63D595D89CB54D8C407D06EFFCE4CDA8C3EC1C9F51E" },
|
||||
{ name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" },
|
||||
{ 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.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "1510D4A03C28880E62974389E5BF1A5A185036BA07392F1D769620706A9E042F" },
|
||||
{ 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.1", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "4CD513FC62523053E62ED7BAC2F36136EC17D6A8942728250A9A00A15E340E4B" },
|
||||
{ name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" },
|
||||
{ name = "gleam_erlang", version = "0.27.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "DE468F676D71B313C6C8C5334425CFCF827837333F8AB47B64D8A6D7AA40185D" },
|
||||
{ name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" },
|
||||
{ name = "gleam_otp", version = "0.12.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "BFACC1513410DF5A1617169A9CD7EA334973AC71D860A17574BA7B2EADD89A6F" },
|
||||
{ name = "gleam_stdlib", version = "0.40.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "86606B75A600BBD05E539EB59FABC6E307EEEA7B1E5865AFB6D980A93BCB2181" },
|
||||
{ name = "glexer", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "BD477AD657C2B637FEF75F2405FAEFFA533F277A74EF1A5E17B55B1178C228FB" },
|
||||
{ name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" },
|
||||
{ name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" },
|
||||
]
|
||||
|
||||
[requirements]
|
||||
exercism_test_runner = { version = "~> 1.4" }
|
||||
gleam_bitwise = { version = "~> 1.2" }
|
||||
gleam_erlang = { version = ">= 0.25.0 and < 1.0.0" }
|
||||
gleam_otp = { version = "~> 0.7 or ~> 1.0" }
|
||||
gleam_stdlib = { version = "~> 0.32 or ~> 1.0" }
|
||||
simplifile = { version = "~> 1.0" }
|
25
gleam/lasagna/src/lasagna.gleam
Normal file
25
gleam/lasagna/src/lasagna.gleam
Normal file
|
@ -0,0 +1,25 @@
|
|||
// Please define the expected_minutes_in_oven function
|
||||
pub fn expected_minutes_in_oven() -> Int {
|
||||
40
|
||||
}
|
||||
|
||||
// Please define the remaining_minutes_in_oven function
|
||||
pub fn remaining_minutes_in_oven(n: Int) -> Int {
|
||||
expected_minutes_in_oven() - n
|
||||
}
|
||||
|
||||
// Please define the preparation_time_in_minutes function
|
||||
pub fn preparation_time_in_minutes(n: Int) -> Int {
|
||||
n * 2
|
||||
}
|
||||
|
||||
// Please define the total_time_in_minutes function
|
||||
pub fn total_time_in_minutes(x: Int, y: Int) -> Int {
|
||||
preparation_time_in_minutes(x)
|
||||
+ { expected_minutes_in_oven() - remaining_minutes_in_oven(y) }
|
||||
}
|
||||
|
||||
// Please define the alarm function
|
||||
pub fn alarm() -> String {
|
||||
"Ding!"
|
||||
}
|
42
gleam/lasagna/test/lasagna_test.gleam
Normal file
42
gleam/lasagna/test/lasagna_test.gleam
Normal file
|
@ -0,0 +1,42 @@
|
|||
import exercism/should
|
||||
import exercism/test_runner
|
||||
import lasagna
|
||||
|
||||
pub fn main() {
|
||||
test_runner.main()
|
||||
}
|
||||
|
||||
pub fn expected_minutes_in_oven_test() {
|
||||
lasagna.expected_minutes_in_oven()
|
||||
|> should.equal(40)
|
||||
}
|
||||
|
||||
pub fn remaining_minutes_in_oven_test() {
|
||||
lasagna.remaining_minutes_in_oven(25)
|
||||
|> should.equal(15)
|
||||
}
|
||||
|
||||
pub fn preparation_time_in_minutes_for_one_layer_test() {
|
||||
lasagna.preparation_time_in_minutes(1)
|
||||
|> should.equal(2)
|
||||
}
|
||||
|
||||
pub fn preparation_time_in_minutes_for_multiple_layers_test() {
|
||||
lasagna.preparation_time_in_minutes(4)
|
||||
|> should.equal(8)
|
||||
}
|
||||
|
||||
pub fn total_time_in_minutes_for_one_layer_test() {
|
||||
lasagna.total_time_in_minutes(1, 30)
|
||||
|> should.equal(32)
|
||||
}
|
||||
|
||||
pub fn total_time_in_minutes_for_multiple_layers_test() {
|
||||
lasagna.total_time_in_minutes(4, 8)
|
||||
|> should.equal(16)
|
||||
}
|
||||
|
||||
pub fn notification_message_test() {
|
||||
lasagna.alarm()
|
||||
|> should.equal("Ding!")
|
||||
}
|
Loading…
Reference in a new issue