Trilhas
/
Elm
Elm
/
Exercícios
/
Caça ao Tesouro de Tisbury
Caça ao Tesouro de Tisbury

Caça ao Tesouro de Tisbury

Exercício de aprendizagem

Introdução

Tuplas

As tuplas em Elm podem guardar dois ou três valores, e cada valor pode ter qualquer tipo. No Elm, as tuplas são usadas principalmente para tipos simples e transitórios. Por esse motivo, as tuplas têm no máximo 3 valores e, para reforçar isso, só existem funções auxiliares para 2 valores. Para dados mais complexos, é melhor usar registros.

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"

As tuplas podem ser desestruturadas em vinculações usando correspondência de padrões de tupla. A desestruturação pode ser feita em expressões let, declarações de função e instruções 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

Instruções

Aazra e Rui estão criando uma caça ao tesouro com tema de piratas. Um deles tem uma lista de tesouros com localizações no mapa, e o outro tem uma lista de nomes de lugares com localizações no mapa.

Tesouro Localização
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)
Nome do lugar Localização Quadrante
Seaside Cottages (C, 1) Azul
Aqua Lagoon (Island of Mystery) (F, 1) Amarelo
Deserted Docks (A, 2) Azul
Spiky Rocks (D, 3) Amarelo
Abandoned Lighthouse (B, 4) Azul
Hidden Spring (Island of Mystery) (E, 4) Amarelo
Stormy Breakwater (B, 5) Roxo
Old Schooner (A, 6) Roxo
Tangled Seaweed Patch (D, 6) Laranja
Quiet Inlet (Island of Mystery) (E, 7) Laranja
Windswept Hilltop (Island of Mystery) (F, 7) Laranja
Harbor Managers Office (A, 8) Roxo
Foggy Seacave (C, 8) Roxo

Os jogadores vão percorrer o mapa pegando tesouros pelo caminho. As localizações de tesouros e de lugares são escritas de formas diferentes, para deixar o desafio ainda maior. Também existem alguns lugares especiais, onde certos tesouros podem ser trocados por outros, o que dá uma reviravolta extra ao jogo. Sua tarefa é escrever funções que ajudem os dois com o jogo.

1. Converter localizações

Implemente a função placeLocationToTreasureLocation, que recebe uma localização de lugar (como ('C', 1)) e a converte em uma localização de tesouro (como (1, 'C')).

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

2. Comparar localizações de tesouros e de lugares

Implemente a função treasureLocationMatchesPlaceLocation, que recebe uma PlaceLocation (como ('C', 1)) e retorna true se ela corresponder a uma TreasureLocation (como (1, 'C')).

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

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

3. Contar localizações de tesouros

Implemente a função countPlaceTreasures, que recebe um lugar (como ("Aqua Lagoon (Island of Mystery)", ('F', 1))) e a lista de tesouros, e retorna quantos tesouros podem ser encontrados ali.

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

countPlaceTreasures place treasures =
--> 2

4. Lugares especiais

Implemente a função specialCaseSwapPossible, que recebe um tesouro (como ("Amethyst Octopus", (1, 'F'))) e um lugar (como ("Seaside Cottages ", ('C', 1))), e retorna true para as seguintes combinações:

  • O Brass Spyglass pode ser trocado por qualquer outro tesouro no Abandoned Lighthouse
  • O Amethyst Octopus pode ser trocado pelo Crystal Crab ou pela Glass Starfish no Stormy Breakwater
  • O Vintage Pirate Hat pode ser trocado pelo Model Ship in Large Bottle ou pelo Antique Glass Fishnet Float no Harbor Managers Office

Tente implementar essa função como uma instrução case com uma tupla ad hoc, em vez de usar condicionais if (esse é um idioma comum em Elm).

Editar via GitHub O link abre em uma nova janela ou aba
Elm Exercism

Tudo pronto para começar Caça ao Tesouro de Tisbury?

Crie sua conta no Exercism para aprender e dominar Elm com 28 conceitos110 exercícios e mentoria humana de verdade, tudo de graça.