140 lines
3.6 KiB
Markdown
140 lines
3.6 KiB
Markdown
|
# High School Sweetheart
|
||
|
|
||
|
Welcome to High School Sweetheart on Exercism's Elixir 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
|
||
|
|
||
|
## Strings
|
||
|
|
||
|
Strings in Elixir are delimited by double quotes, and they are encoded in UTF-8:
|
||
|
|
||
|
```elixir
|
||
|
"Hi!"
|
||
|
```
|
||
|
|
||
|
Strings can be concatenated using the `<>/2` operator:
|
||
|
|
||
|
```elixir
|
||
|
"Welcome to" <> " " <> "New York"
|
||
|
# => "Welcome to New York"
|
||
|
```
|
||
|
|
||
|
Strings in Elixir support interpolation using the `#{}` syntax:
|
||
|
|
||
|
```elixir
|
||
|
"6 * 7 = #{6 * 7}"
|
||
|
# => "6 * 7 = 42"
|
||
|
```
|
||
|
|
||
|
To put a newline character in a string, use the `\n` escape code:
|
||
|
|
||
|
```elixir
|
||
|
"1\n2\n3\n"
|
||
|
```
|
||
|
|
||
|
To comfortably work with texts with a lot of newlines, use the triple-double-quote heredoc syntax instead:
|
||
|
|
||
|
```elixir
|
||
|
"""
|
||
|
1
|
||
|
2
|
||
|
3
|
||
|
"""
|
||
|
```
|
||
|
|
||
|
Elixir provides many functions for working with strings in the `String` module.
|
||
|
|
||
|
## 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 as the first argument to the next function call.
|
||
|
|
||
|
```elixir
|
||
|
"hello"
|
||
|
|> String.upcase()
|
||
|
|> Kernel.<>("?!")
|
||
|
# => "HELLO?!"
|
||
|
```
|
||
|
|
||
|
## 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 `HighSchoolSweetheart.first_letter/1` function. It should take a name and return its first letter. It should clean up any unnecessary whitespace from the name.
|
||
|
|
||
|
```elixir
|
||
|
HighSchoolSweetheart.first_letter("Jane")
|
||
|
# => "J"
|
||
|
```
|
||
|
|
||
|
## 2. Format the first letter as an initial
|
||
|
|
||
|
Implement the `HighSchoolSweetheart.initial/1` function. It should take a name and return its first letter, uppercase, followed by a dot. Make sure to reuse `HighSchoolSweetheart.first_letter/1` that you defined in the previous step.
|
||
|
|
||
|
```elixir
|
||
|
HighSchoolSweetheart.initial("Robert")
|
||
|
# => "R."
|
||
|
```
|
||
|
|
||
|
## 3. Split the full name into the first name and the last name
|
||
|
|
||
|
Implement the `HighSchoolSweetheart.initials/1` 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 `HighSchoolSweetheart.initial/1` that you defined in the previous step.
|
||
|
|
||
|
```elixir
|
||
|
HighSchoolSweetheart.initials("Lance Green")
|
||
|
# => "L. G."
|
||
|
```
|
||
|
|
||
|
## 4. Put the initials inside of the heart
|
||
|
|
||
|
Implement the `HighSchoolSweetheart.pair/2` function. It should take two full names and return the initials inside an ASCII heart. Make sure to reuse `HighSchoolSweetheart.initials/1` that you defined in the previous step.
|
||
|
|
||
|
```elixir
|
||
|
HighSchoolSweetheart.pair("Blake Miller", "Riley Lewis")
|
||
|
# => """
|
||
|
# ****** ******
|
||
|
# ** ** ** **
|
||
|
# ** ** ** **
|
||
|
# ** * **
|
||
|
# ** **
|
||
|
# ** B. M. + R. L. **
|
||
|
# ** **
|
||
|
# ** **
|
||
|
# ** **
|
||
|
# ** **
|
||
|
# ** **
|
||
|
# ** **
|
||
|
# ***
|
||
|
# *
|
||
|
# """
|
||
|
```
|
||
|
|
||
|
## Source
|
||
|
|
||
|
### Created by
|
||
|
|
||
|
- @angelikatyborska
|
||
|
|
||
|
### Contributed to by
|
||
|
|
||
|
- @neenjaw
|