-
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 high-school-sweetheart
- Loading branch information
Showing
8 changed files
with
334 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/high_school_sweetheart.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,30 @@ | ||
# Hints | ||
|
||
## General | ||
|
||
- Browse the [functions available in the _string module_][string-module-functions] to discover which operations on strings Gleam's standard library offers. | ||
|
||
## 1. Get the name's first letter | ||
|
||
- There is a [function][string-first] to get the first character from a string. | ||
- There are multiple [functions][string-trim] to remove leading, trailing, or leading and trailing whitespaces from a string. | ||
|
||
## 2. Format the first letter as an initial | ||
|
||
- There is a [function][string-upcase] to convert all characters in a string to their uppercase variant. | ||
- The `<>` operator can be used to concatenate strings. | ||
|
||
## 3. Split the full name into the first name and the last name | ||
|
||
- There is a [function][string-split] that splits a string on whitespace characters. | ||
- A few first elements of a list can be assigned to variables by pattern matching on the list. | ||
|
||
## 4. Put the initials inside of the heart | ||
|
||
- The `<>` operator can be used to concatenate strings. | ||
|
||
[string-module-functions]: https://hexdocs.pm/gleam_stdlib/gleam/string.html | ||
[string-first]: https://hexdocs.pm/gleam_stdlib/gleam/string.html#first | ||
[string-trim]: https://hexdocs.pm/gleam_stdlib/gleam/string.html#trim | ||
[string-upcase]: https://hexdocs.pm/gleam_stdlib/gleam/string.html#uppercase | ||
[string-split]: https://hexdocs.pm/gleam_stdlib/gleam/string.html#split |
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,127 @@ | ||
# High School Sweetheart | ||
|
||
Welcome to High School Sweetheart 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 | ||
|
||
## Pipe Operator | ||
|
||
The `|>` operator is called the pipe operator. It can be used to chain function calls together in such a way that the value returned by the previous function call is passed to the next function call. | ||
|
||
```gleam | ||
"hello" | ||
|> string.uppercase | ||
|> string.append("?!") | ||
// -> "HELLO?!" | ||
``` | ||
|
||
The above code is equivalent to the following: | ||
|
||
```gleam | ||
string.append(string.uppercase("hello"), "?!") | ||
``` | ||
|
||
The pipe operator will either pass the value as the first argument to the function call, or the only argument to a new call, selecting whichever would have the correct type. | ||
|
||
```gleam | ||
100 | ||
|> function_that_takes_two_arguments(1) | ||
// Is equivalent to | ||
function_that_takes_two_arguments(100, 1) | ||
``` | ||
|
||
```gleam | ||
100 | ||
|> function_that_returns_a_function(1) | ||
// Is equivalent to | ||
function_that_returns_a_function(1)(100) | ||
``` | ||
|
||
Sometimes we want to pass the value into another position, in this case the `_` placeholder can be used to indicate where the value should be inserted. | ||
|
||
```gleam | ||
100 | ||
|> some_function(1, _, 2) | ||
``` | ||
|
||
## Instructions | ||
|
||
In this exercise, you are going to help high school sweethearts profess their love on social media by generating an ASCII heart with their initials: | ||
|
||
``` | ||
****** ****** | ||
** ** ** ** | ||
** ** ** ** | ||
** * ** | ||
** ** | ||
** J. K. + M. B. ** | ||
** ** | ||
** ** | ||
** ** | ||
** ** | ||
** ** | ||
** ** | ||
*** | ||
* | ||
``` | ||
|
||
## 1. Get the name's first letter | ||
|
||
Implement the `first_letter` function. It should take a name and return its first letter. It should clean up any unnecessary whitespace from the name. | ||
|
||
```gleam | ||
first_letter("Jane") | ||
// -> "J" | ||
``` | ||
|
||
## 2. Format the first letter as an initial | ||
|
||
Implement the `initial` function. It should take a name and return its first letter, uppercase, followed by a dot. Make sure to reuse `first_letter` that you defined in the previous step. | ||
|
||
```gleam | ||
initial("Robert") | ||
// -> "R." | ||
``` | ||
|
||
## 3. Split the full name into the first name and the last name | ||
|
||
Implement the `initials` function. It should take a full name, consisting of a first name and a last name separated by a space, and return the initials. Make sure to reuse `initial` that you defined in the previous step. | ||
|
||
```gleam | ||
initials("Lance Green") | ||
// -> "L. G." | ||
``` | ||
|
||
## 4. Put the initials inside of the heart | ||
|
||
Implement the `pair` function. It should take two full names and return the initials inside an ASCII heart. Make sure to reuse `initials` that you defined in the previous step. | ||
|
||
```gleam | ||
pair("Blake Miller", "Riley Lewis") | ||
// -> " | ||
// ****** ****** | ||
// ** ** ** ** | ||
// ** ** ** ** | ||
// ** * ** | ||
// ** ** | ||
// ** B. M. + R. L. ** | ||
// ** ** | ||
// ** ** | ||
// ** ** | ||
// ** ** | ||
// ** ** | ||
// ** ** | ||
// *** | ||
// * | ||
// " | ||
``` | ||
|
||
## 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 = "high_school_sweetheart" | ||
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/high-school-sweetheart/src/high_school_sweetheart.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 | ||
import gleam/result | ||
import gleam/string | ||
|
||
pub fn first_letter(name: String) { | ||
name | ||
|> string.trim | ||
|> string.first | ||
|> result.unwrap("?") | ||
} | ||
|
||
pub fn initial(name: String) { | ||
name | ||
|> first_letter | ||
|> string.uppercase | ||
|> string.append(".") | ||
} | ||
|
||
pub fn initials(full_name: String) { | ||
full_name | ||
|> string.split(" ") | ||
|> list.map(initial) | ||
|> string.join(" ") | ||
} | ||
|
||
pub fn pair(full_name1: String, full_name2: String) { | ||
" | ||
****** ****** | ||
** ** ** ** | ||
** ** ** ** | ||
** * ** | ||
** ** | ||
** " <> initials(full_name1) <> " + " <> initials(full_name2) <> " ** | ||
** ** | ||
** ** | ||
** ** | ||
** ** | ||
** ** | ||
** ** | ||
*** | ||
* | ||
" | ||
} |
59 changes: 59 additions & 0 deletions
59
gleam/high-school-sweetheart/test/high_school_sweetheart_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,59 @@ | ||
import exercism/should | ||
import exercism/test_runner | ||
import high_school_sweetheart | ||
|
||
pub fn main() { | ||
test_runner.main() | ||
} | ||
|
||
pub fn first_letter_test() { | ||
high_school_sweetheart.first_letter("Mary") | ||
|> should.equal("M") | ||
} | ||
|
||
pub fn first_letter_does_not_change_case_test() { | ||
high_school_sweetheart.first_letter("john") | ||
|> should.equal("j") | ||
} | ||
|
||
pub fn first_letter_removes_whitespace_test() { | ||
high_school_sweetheart.first_letter("\n\t Sarah ") | ||
|> should.equal("S") | ||
} | ||
|
||
pub fn initial_test() { | ||
high_school_sweetheart.initial("Betty") | ||
|> should.equal("B.") | ||
} | ||
|
||
pub fn initial_uppercases_letter_test() { | ||
high_school_sweetheart.initial("james") | ||
|> should.equal("J.") | ||
} | ||
|
||
pub fn initials_test() { | ||
high_school_sweetheart.initials("Linda Miller") | ||
|> should.equal("L. M.") | ||
} | ||
|
||
pub fn pair_test() { | ||
high_school_sweetheart.pair("Avery Bryant", "Charlie Dixon") | ||
|> should.equal( | ||
" | ||
****** ****** | ||
** ** ** ** | ||
** ** ** ** | ||
** * ** | ||
** ** | ||
** A. B. + C. D. ** | ||
** ** | ||
** ** | ||
** ** | ||
** ** | ||
** ** | ||
** ** | ||
*** | ||
* | ||
", | ||
) | ||
} |