-
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
265 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/pacman_rules.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,27 @@ | ||
# Hints | ||
|
||
## General | ||
|
||
- Don't worry about how the arguments are derived, just focus on combining the arguments to return the intended result. | ||
|
||
## 1. Define if pac-man can eat a ghost | ||
|
||
- The function must return a [bool][bool] value. | ||
- You can use the [bool][bool] operator `&&` to combine the arguments for a result. | ||
|
||
## 2. Define if pac-man scores | ||
|
||
- The function must return a [bool][bool] value. | ||
- You can use the [bool][bool] operator `||` to combine the arguments for a result. | ||
|
||
## 3. Define if pac-man loses | ||
|
||
- The function must return a [bool][bool] value. | ||
- You can use the [bool][bool] operators `&&` and `!` to combine the arguments for a result. | ||
|
||
## 4. Define if pac-man wins | ||
|
||
- The function must return a [bool][bool] value. | ||
- You can use the [bool][bool] operators `&&` and `!` to combine the arguments and results of one of the previously implemented functions. | ||
|
||
[bool]: https://gleam.run/book/tour/bools.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,88 @@ | ||
# Pacman Rules | ||
|
||
Welcome to Pacman Rules 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 | ||
|
||
## Bools | ||
|
||
Gleam represents true and false values with the `Bool` type. There are only two values: `True` and `False`. These values can be bound to a variable: | ||
|
||
```gleam | ||
let true_variable = True | ||
let false_variable = False | ||
``` | ||
|
||
The `&&`, `||`, and `!` operators can be used to manipulate boolean values: | ||
|
||
```gleam | ||
True && True // -> True | ||
True && False // -> False | ||
False || True // -> True | ||
False || False // -> False | ||
!False // -> True | ||
!True // -> False | ||
``` | ||
|
||
The `&&` and `||` operators use short-circuit evaluation, which means that the expression on the right-hand side of the operator is only evaluated if needed. | ||
|
||
Each of the operators has a different precedence, where `!` is evaluated before `&&` and `||`. Braces can be used to evaluate one part of the expression before the others: | ||
|
||
```gleam | ||
!True && False // -> False | ||
!{True && False} // -> True | ||
``` | ||
|
||
## Instructions | ||
|
||
In this exercise, you need to translate some rules from the classic game Pac-Man into Gleam functions. | ||
|
||
You have four rules to translate, all related to the game states. | ||
|
||
> Don't worry about how the arguments are derived, just focus on combining the arguments to return the intended result. | ||
## 1. Define if Pac-Man eats a ghost | ||
|
||
Define the `eat_ghost` function that takes two arguments (_if Pac-Man has a power pellet active_ and _if Pac-Man is touching a ghost_) and returns a boolean value if Pac-Man is able to eat the ghost. The function should return `True` only if Pac-Man has a power pellet active and is touching a ghost. | ||
|
||
```gleam | ||
eat_ghost(False, True) | ||
// -> False | ||
``` | ||
|
||
## 2. Define if Pac-Man scores | ||
|
||
Define the `score` function that takes two arguments (_if Pac-Man is touching a power pellet_ and _if Pac-Man is touching a dot_) and returns a boolean value if Pac-Man scored. The function should return `True` if Pac-Man is touching a power pellet or a dot. | ||
|
||
```gleam | ||
score(True, True) | ||
// -> True | ||
``` | ||
|
||
## 3. Define if Pac-Man loses | ||
|
||
Define the `lose` function that takes two arguments (_if Pac-Man has a power pellet active_ and _if Pac-Man is touching a ghost_) and returns a boolean value if Pac-Man loses. The function should return `True` if Pac-Man is touching a ghost and does not have a power pellet active. | ||
|
||
```gleam | ||
lose(False, True) | ||
// -> True | ||
``` | ||
|
||
## 4. Define if Pac-Man wins | ||
|
||
Define the `win` function that takes three arguments (_if Pac-Man has eaten all of the dots_, _if Pac-Man has a power pellet active_, and _if Pac-Man is touching a ghost_) and returns a boolean value if Pac-Man wins. The function should return `True` if Pac-Man has eaten all of the dots and has not lost based on the arguments defined in part 3. | ||
|
||
```gleam | ||
win(False, True, False) | ||
// -> False | ||
``` | ||
|
||
## 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 = "pacman_rules" | ||
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,19 @@ | ||
pub fn eat_ghost(power_pellet_active: Bool, touching_ghost: Bool) -> Bool { | ||
power_pellet_active && touching_ghost | ||
} | ||
|
||
pub fn score(touching_power_pellet: Bool, touching_dot: Bool) -> Bool { | ||
touching_power_pellet || touching_dot | ||
} | ||
|
||
pub fn lose(power_pellet_active: Bool, touching_ghost: Bool) -> Bool { | ||
touching_ghost && !power_pellet_active | ||
} | ||
|
||
pub fn win( | ||
has_eaten_all_dots: Bool, | ||
power_pellet_active: Bool, | ||
touching_ghost: Bool, | ||
) -> Bool { | ||
has_eaten_all_dots && !lose(power_pellet_active, touching_ghost) | ||
} |
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,58 @@ | ||
import exercism/test_runner | ||
import pacman_rules | ||
|
||
pub fn main() { | ||
test_runner.main() | ||
} | ||
|
||
pub fn ghost_gets_eaten_test() { | ||
let assert True = pacman_rules.eat_ghost(True, True) | ||
} | ||
|
||
pub fn ghost_does_not_get_eaten_because_no_power_pellet_active_test() { | ||
let assert False = pacman_rules.eat_ghost(False, True) | ||
} | ||
|
||
pub fn ghost_does_not_get_eaten_because_not_touching_ghost_test() { | ||
let assert False = pacman_rules.eat_ghost(True, False) | ||
} | ||
|
||
pub fn ghost_does_not_get_eaten_because_no_power_pellet_is_active_even_if_not_touching_ghost_test() { | ||
let assert False = pacman_rules.eat_ghost(False, False) | ||
} | ||
|
||
pub fn score_when_eating_dot_test() { | ||
let assert True = pacman_rules.score(True, False) | ||
} | ||
|
||
pub fn score_when_eating_power_pellet_test() { | ||
let assert True = pacman_rules.score(False, True) | ||
} | ||
|
||
pub fn no_score_when_nothing_eaten_test() { | ||
let assert False = pacman_rules.score(False, False) | ||
} | ||
|
||
pub fn lose_if_touching_ghost_without_power_pellet_active_test() { | ||
let assert True = pacman_rules.lose(False, True) | ||
} | ||
|
||
pub fn dont_lose_if_touching_ghost_with_power_pellet_active_test() { | ||
let assert False = pacman_rules.lose(True, True) | ||
} | ||
|
||
pub fn dont_lose_if_not_touching_ghost_test() { | ||
let assert False = pacman_rules.lose(True, False) | ||
} | ||
|
||
pub fn win_if_all_dots_eaten_test() { | ||
let assert True = pacman_rules.win(True, False, False) | ||
} | ||
|
||
pub fn dont_win_if_all_dots_eaten_but_touching_ghost_test() { | ||
let assert False = pacman_rules.win(True, False, True) | ||
} | ||
|
||
pub fn win_if_all_dots_eaten_and_touching_ghost_with_power_pellet_active_test() { | ||
let assert True = pacman_rules.win(True, True, True) | ||
} |