Треки
/
Elm
Elm
/
Вправи
/
Полювання за скарбами в Тісбері
Полювання за скарбами в Тісбері

Полювання за скарбами в Тісбері

Навчальна вправа

Вступ

Кортежі

Кортежі в Elm можуть містити два або три значення, і кожне з них може мати будь-який тип. В Elm кортежі переважно використовують для простих тимчасових типів. Тому кортежі мають максимум 3 значення, а як додатковий стимул зручні функції передбачено лише для 2 значень. Для складніших даних краще перейти на записи.

type alias IntStringTuple = (Int, String)

aTuple : IntStringTuple
aTuple = (123, "elements can be of differing types")

anotherTuple : (String, String)
anotherTuple = Tuple.pair "this time it's" "two strings"
    --> ("this time it's", "two strings")

Tuple.first aTuple
    --> 123

Tuple.second aTuple
    --> "elements can be of differing types"

Кортежі можна деструктурувати у привʼязках за допомогою зіставлення зі зразком. Деструктурування можна виконувати у виразах let, оголошеннях функцій і конструкціях case.

repeatString : (Int, String) -> Bool
repeatString aTuple =
let
    (aNumber, aString) = aTuple
in
    String.repeat aNumber aString

repeatStringAgain : (Int, String) -> Bool
repeatStringAgain (aNumber, aString) = String.repeat aNumber aString

has123 : (Int, String, Bool) -> Bool
has123 aTuple =
    case aTuple of
        (123, _, _) ->
            True
        (_, "123", _) ->
            True
        (_, _, True) ->
            True
        _ ->
            False

Вказівки

Aazra та Rui розробляють піратський квест з пошуку скарбів. Є список скарбів із зазначенням їхніх розташувань на карті, а також список назв місць із зазначенням їхніх розташувань.

Скарб Розташування
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)
Назва місця Розташування Квадрант
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

Гравці подорожують картою і дорогою збирають скарби. Розташування скарбів і місць записано по-різному, щоб додати додаткову складність. Є також особливі місця, де одні скарби можна обміняти на інші, щоб додати грі ще одну цікавинку. Наше завдання - написати функції, які допоможуть їм у цій грі.

1. Перетворення розташувань

Реалізуйте функцію placeLocationToTreasureLocation, яка приймає розташування місця (наприклад, ('C', 1)) і перетворює його на розташування скарбу (наприклад, (1, 'C')).

placeLocationToTreasureLocation ('C', 1)
--> (1,'C')

2. Порівняння розташувань скарбів і місць

Реалізуйте функцію treasureLocationMatchesPlaceLocation, яка приймає PlaceLocation (наприклад, ('C', 1)) і повертає правду, якщо воно збігається з TreasureLocation (наприклад, (1, 'C')).

treasureLocationMatchesPlaceLocation ('C', 1) (1, 'C')
--> true

treasureLocationMatchesPlaceLocation ('C', 1) (2, 'C')
--> false

3. Підрахунок розташувань скарбів

Реалізуйте функцію countPlaceTreasures, яка приймає місце (наприклад, ("Aqua Lagoon (Island of Mystery)", ('F', 1))) і список скарбів, та повертає кількість скарбів, які можна там знайти.

place = ("Aqua Lagoon (Island of Mystery)", ('F', 1))

countPlaceTreasures place treasures =
--> 2

4. Особливі місця

Реалізуйте функцію specialCaseSwapPossible, яка приймає скарб (наприклад, ("Amethyst Octopus", (1, 'F'))) і місце (наприклад, ("Seaside Cottages ", ('C', 1))), та повертає правду для таких комбінацій:

  • Brass Spyglass можна обміняти на будь-який інший скарб у Abandoned Lighthouse
  • Amethyst Octopus можна обміняти на Crystal Crab або Glass Starfish у Stormy Breakwater
  • Vintage Pirate Hat можна обміняти на Model Ship in Large Bottle або Antique Glass Fishnet Float у Harbor Managers Office

Спробуйте реалізувати цю функцію як конструкцію case зі спеціально створеним кортежем, а не через умовні конструкції if (це поширена ідіома в Elm).

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elm Exercism

Час розпочати Полювання за скарбами в Тісбері?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Elm, а також 28 концепцій110 вправ та справжнє наставництво від людей, і все це безкоштовно.