-
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.
[gleam] complete tisbury_treasure_hunt
- Loading branch information
Showing
8 changed files
with
389 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/tisbury_treasure_hunt.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 | ||
|
||
## 1. Convert locations | ||
|
||
- Elements can be accessed from a tuple using pattern matching or indexing. | ||
|
||
## 2. Compare treasure and place locations | ||
|
||
- Tuples can be compared for equality if they have the same length and the same types in the same order. | ||
|
||
## 3. Count treasure locations | ||
|
||
- The `filter` function from the `gleam/list` module can be used to remove elements from a list based on a function that returns a bool. |
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,155 @@ | ||
# Tisbury Treasure Hunt | ||
|
||
Welcome to Tisbury Treasure Hunt 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 | ||
|
||
## Tuples | ||
|
||
A tuple is an ordered container of values. Like all Gleam data types tuples are immutable. | ||
Each element of a tuple can be of a different type -- they can even be other tuples. | ||
|
||
Tuples are defined as comma-separated values between `#(` and `)`: `#(1, 2.0, "Three")`. | ||
|
||
```gleam | ||
#("one", 2) // Tuple pair (2 values) | ||
#("one", 2, 3.0) // Tuple triplet (3 values) | ||
``` | ||
|
||
Tuples with the same length and the same types (in the same order) can be compared for equality. | ||
|
||
```gleam | ||
#(1, 2) == #(1, 2) // Same length, same types, same values, same order | ||
// -> True | ||
#(1, 2) == #(2, 1) // Same length, same types, same values, different order | ||
// -> False | ||
#(1, 2) == #(1, "2") // Same length, different types | ||
// Compile error! | ||
#(1, 2) == #(1, 2, 3) // Different length | ||
// Compile error! | ||
``` | ||
|
||
There are three ways in which you can get the contained values out of a tuple: | ||
|
||
- Indexing. | ||
- Pattern matching with `let`. | ||
- Pattern matching with `case`. | ||
|
||
```gleam | ||
let person = #("Jordan", 170) | ||
// Option 1: Indexing | ||
person.0 // -> "Jordan" | ||
person.1 // -> 170 | ||
// Option 2: let | ||
let #(name2, length2) = person | ||
// -> name2 = "Jordan" | ||
// -> length2 = 170 | ||
// Option 3: case | ||
case person { | ||
#(name3, length3) -> { | ||
name3 // -> "Jordan" | ||
length3 // -> 170 | ||
} | ||
} | ||
``` | ||
|
||
## Instructions | ||
|
||
Aazra and Rui are designing a pirate-themed treasure hunt. There is a list of treasures with map locations, the other a list of place names with map locations. | ||
|
||
<table> | ||
<tr><th>Azara's List</th><th></th><th>Rui's List</th></tr> | ||
<tr><td> | ||
|
||
| Treasure | Location | | ||
| --------------------------- | -------- | | ||
| Amethyst Octopus | (1, F) | | ||
| Angry Monkey Figurine | (5, B) | | ||
| Antique Glass Fishnet Float | (3, D) | | ||
| Brass Spyglass | (4, B) | | ||
| Carved Wooden Elephant | (8, C) | | ||
| Crystal Crab | (6, A) | | ||
| Glass Starfish | (6, D) | | ||
| Model Ship in Large Bottle | (8, A) | | ||
| Pirate Flag | (7, F) | | ||
| Robot Parrot | (1, C) | | ||
| Scrimshaw Whale's Tooth | (1, F) | | ||
| Silver Seahorse | (4, E) | | ||
| Vintage Pirate Hat | (7, E) | | ||
|
||
</td><td></td><td> | ||
|
||
| Place Name | Location | Quadrant | | ||
| ------------------------------------- | -------- | -------- | | ||
| Seaside Cottages | (C, 1) | Blue | | ||
| Aqua Lagoon (Island of Mystery) | (F, 1) | Yellow | | ||
| Deserted Docks | (A, 2) | Blue | | ||
| Spiky Rocks | (D, 3) | Yellow | | ||
| Abandoned Lighthouse | (B, 4) | Blue | | ||
| Hidden Spring (Island of Mystery) | (E, 4) | Yellow | | ||
| Stormy Breakwater | (B, 5) | Purple | | ||
| Old Schooner | (A, 6) | Purple | | ||
| Tangled Seaweed Patch | (D, 6) | Orange | | ||
| Quiet Inlet (Island of Mystery) | (E, 7) | Orange | | ||
| Windswept Hilltop (Island of Mystery) | (F, 7) | Orange | | ||
| Harbor Managers Office | (A, 8) | Purple | | ||
| Foggy Seacave | (C, 8) | Purple | | ||
|
||
</td></tr> | ||
</table> | ||
|
||
But things are a bit disorganized: Aazra's coordinates appear to be formatted and sorted differently from Rui's, and they have to keep looking from one list to the other to figure out which treasures go with which locations. Being budding Gleamlins, they have come to you for help in writing a small program (a set of functions, really) to better organize their hunt information. | ||
|
||
## 1. Convert locations | ||
|
||
Implement the `place_location_to_treasure_location` function that takes a place Location (such as `#("C", 1)`) and converts it to a treasure location (such as `#(1, "C")`). | ||
|
||
```gleam | ||
place_location_to_treasure_location(#("C", 1)) | ||
// -> #(1, "C") | ||
``` | ||
|
||
## 2. Compare treasure and place locations | ||
|
||
Implement the `treasure_location_matches_place_location` function that takes a place location (such as `#("C", 1)`) and returns `True` if it matches a treasure location (such as `#(1, "C")`). | ||
|
||
```gleam | ||
treasure_location_matches_place_location(#("C", 1), #(1, "C")) | ||
// -> True | ||
treasure_location_matches_place_location(#("C", 1) #(2, "C")) | ||
// -> False | ||
``` | ||
|
||
## 3. Count treasure locations | ||
|
||
Implement the `count_place_treasures` function, that takes a place (such as `#("Aqua Lagoon (Island of Mystery)", #("F", 1))`), and the list of treasures, and returns the number of treasures that can be found there. | ||
|
||
```gleam | ||
let place = #("Aqua Lagoon (Island of Mystery)", #("F", 1)) | ||
count_place_treasures(place, treasures) | ||
// -> 2 | ||
``` | ||
|
||
## 4. Special Places | ||
|
||
Implement the `special_case_swap_possible` function, which takes a treasure (such as `#("Amethyst Octopus", #(1, "F"))`) and a Place (such as `#("Seaside Cottages", #("C", 1))`), and returns `True` for the following combinations: | ||
|
||
- The Brass Spyglass can be swapped for any other treasure at the Abandoned Lighthouse. | ||
- The Amethyst Octopus can be swapped for the Crystal Crab or the Glass Starfish at the Stormy Breakwater. | ||
- The Vintage Pirate Hat can be swapped for the Model Ship in Large Bottle or the Antique Glass Fishnet Float at the Harbor Managers Office. | ||
|
||
## 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,12 @@ | ||
name = "tisbury_treasure_hunt" | ||
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" |
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 @@ | ||
# 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.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, | ||
{ 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_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" } |
43 changes: 43 additions & 0 deletions
43
gleam/tisbury-treasure-hunt/src/tisbury_treasure_hunt.gleam
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,43 @@ | ||
import gleam/list | ||
|
||
pub fn place_location_to_treasure_location( | ||
place_location: #(String, Int), | ||
) -> #(Int, String) { | ||
#(place_location.1, place_location.0) | ||
} | ||
|
||
pub fn treasure_location_matches_place_location( | ||
place_location: #(String, Int), | ||
treasure_location: #(Int, String), | ||
) -> Bool { | ||
treasure_location == place_location_to_treasure_location(place_location) | ||
} | ||
|
||
pub fn count_place_treasures( | ||
place: #(String, #(String, Int)), | ||
treasures: List(#(String, #(Int, String))), | ||
) -> Int { | ||
treasures | ||
|> list.filter(fn(treasure) { | ||
treasure_location_matches_place_location(place.1, treasure.1) | ||
}) | ||
|> list.length | ||
} | ||
|
||
pub fn special_case_swap_possible( | ||
found_treasure: #(String, #(Int, String)), | ||
place: #(String, #(String, Int)), | ||
desired_treasure: #(String, #(Int, String)), | ||
) -> Bool { | ||
case found_treasure.0, desired_treasure.0, place.0 { | ||
"Brass Spyglass", _, "Abandoned Lighthouse" -> True | ||
"Amethyst Octopus", "Crystal Crab", "Stormy Breakwater" -> True | ||
"Amethyst Octopus", "Glass Starfish", "Stormy Breakwater" -> True | ||
"Vintage Pirate Hat", "Model Ship in Large Bottle", "Harbor Managers Office" -> | ||
True | ||
"Vintage Pirate Hat", | ||
"Antique Glass Fishnet Float", | ||
"Harbor Managers Office" -> True | ||
_, _, _ -> False | ||
} | ||
} |
103 changes: 103 additions & 0 deletions
103
gleam/tisbury-treasure-hunt/test/tisbury_treasure_hunt_test.gleam
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,103 @@ | ||
import exercism/should | ||
import exercism/test_runner | ||
import tisbury_treasure_hunt | ||
|
||
pub fn main() { | ||
test_runner.main() | ||
} | ||
|
||
pub fn place_location_to_treasure_location_test() { | ||
tisbury_treasure_hunt.place_location_to_treasure_location(#("C", 1)) | ||
|> should.equal(#(1, "C")) | ||
} | ||
|
||
pub fn seaside_cottages_is_not_at_1f_test() { | ||
let assert False = | ||
tisbury_treasure_hunt.treasure_location_matches_place_location(#("C", 1), #( | ||
1, | ||
"F", | ||
)) | ||
} | ||
|
||
pub fn aqua_lagoon_is_at_1f_test() { | ||
let assert True = | ||
tisbury_treasure_hunt.treasure_location_matches_place_location(#("F", 1), #( | ||
1, | ||
"F", | ||
)) | ||
} | ||
|
||
pub fn places_should_know_how_many_treasures_are_available_test() { | ||
let treasures = [ | ||
#("Amethyst Octopus", #(1, "F")), | ||
#("Scrimshaw Whale's Tooth", #(1, "F")), | ||
] | ||
let assert 2 = | ||
tisbury_treasure_hunt.count_place_treasures( | ||
#("Aqua Lagoon (Island of Mystery)", #("F", 1)), | ||
treasures, | ||
) | ||
} | ||
|
||
pub fn can_swap_amethyst_octopus_for_crystal_crab_at_stormy_breakwater_test() { | ||
let assert True = | ||
tisbury_treasure_hunt.special_case_swap_possible( | ||
#("Amethyst Octopus", #(1, "F")), | ||
#("Stormy Breakwater", #("B", 5)), | ||
#("Crystal Crab", #(6, "A")), | ||
) | ||
} | ||
|
||
pub fn can_swap_amethyst_octopus_for_glass_starfish_at_stormy_breakwater_test() { | ||
let assert True = | ||
tisbury_treasure_hunt.special_case_swap_possible( | ||
#("Amethyst Octopus", #(1, "F")), | ||
#("Stormy Breakwater", #("B", 5)), | ||
#("Glass Starfish", #(6, "D")), | ||
) | ||
} | ||
|
||
pub fn cannot_swap_amethyst_octopus_for_angry_monkey_figurine_at_stormy_breakwater_test() { | ||
let assert False = | ||
tisbury_treasure_hunt.special_case_swap_possible( | ||
#("Amethyst Octopus", #(1, "F")), | ||
#("Stormy Breakwater", #("B", 5)), | ||
#("Angry Monkey Figurine", #(5, "B")), | ||
) | ||
} | ||
|
||
pub fn can_swap_vintage_pirate_hat_for_model_ship_in_large_bottle_at_harbor_managers_office_test() { | ||
let assert True = | ||
tisbury_treasure_hunt.special_case_swap_possible( | ||
#("Vintage Pirate Hat", #(7, "E")), | ||
#("Harbor Managers Office", #("A", 8)), | ||
#("Model Ship in Large Bottle", #(8, "A")), | ||
) | ||
} | ||
|
||
pub fn can_swap_vintage_pirate_hat_for_antique_glass_fishnet_float_at_harbor_managers_office_test() { | ||
let assert True = | ||
tisbury_treasure_hunt.special_case_swap_possible( | ||
#("Vintage Pirate Hat", #(7, "E")), | ||
#("Harbor Managers Office", #("A", 8)), | ||
#("Antique Glass Fishnet Float", #(3, "D")), | ||
) | ||
} | ||
|
||
pub fn cannot_swap_vintage_pirate_hat_for_carved_wooden_elephant_at_harbor_managers_office_test() { | ||
let assert False = | ||
tisbury_treasure_hunt.special_case_swap_possible( | ||
#("Vintage Pirate Hat", #(7, "E")), | ||
#("Harbor Managers Office", #("A", 8)), | ||
#("Carved Wooden Elephant", #(8, "C")), | ||
) | ||
} | ||
|
||
pub fn cannot_swap_vintage_pirate_hat_for_model_ship_in_large_bottle_at_old_schooner_test() { | ||
let assert False = | ||
tisbury_treasure_hunt.special_case_swap_possible( | ||
#("Vintage Pirate Hat", #(7, "E")), | ||
#("Old Schooner", #("A", 6)), | ||
#("Model Ship in Large Bottle", #(8, "A")), | ||
) | ||
} |