-
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
326 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/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. |
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,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. |
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,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 is 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 |
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 = "valentines_day" | ||
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,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(Korean) -> Yes | ||
Restaurant(Turkish) -> Maybe | ||
Walk(km) if km > 11 -> Yes | ||
Walk(km) if km > 6 -> Maybe | ||
_ -> No | ||
} | ||
} |
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,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) | ||
} |