Percursos
/
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

Tuplos

Os tuplos em Elm podem conter dois ou três valores, e cada valor pode ter qualquer tipo. Em Elm, os tuplos servem sobretudo para tipos transitórios simples. Por isso, os tuplos têm um máximo de 3 valores e, como incentivo adicional, só são fornecidas funções de conveniência para 2 valores. Para dados mais complexos, o melhor é passar para registos.

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"

Os tuplos podem ser desestruturados em ligações, recorrendo à correspondência de padrões de tuplos. A desestruturação pode ser feita em expressões let, declarações de funções 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

A Aazra e o Rui estão a criar uma caça ao tesouro com tema de piratas. Há uma lista de tesouros com localizações no mapa e outra lista de nomes de lugares, também 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) 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

Os jogadores vão percorrer o mapa e apanhar tesouros pelo caminho. As localizações dos tesouros e dos lugares têm formatos diferentes, para acrescentar um desafio extra. Há também alguns lugares especiais, onde certos tesouros podem ser trocados por outros, para acrescentar uma reviravolta extra ao jogo. A tua tarefa é escreveres funções que os ajudem com o jogo.

1. Converter localizações

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

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

2. Comparar localizações de tesouro e de lugar

Implementa a função treasureLocationMatchesPlaceLocation, que recebe uma PlaceLocation (como ('C', 1)) e devolve true se esta corresponder a uma TreasureLocation (como (1, 'C')).

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

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

3. Contar localizações de tesouro

Implementa a função countPlaceTreasures, que recebe um lugar (como ("Aqua Lagoon (Island of Mystery)", ('F', 1))) e a lista de tesouros, e devolve o número de tesouros que se podem encontrar aí.

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

countPlaceTreasures place treasures =
--> 2

4. Lugares especiais

Implementa a função specialCaseSwapPossible, que recebe um tesouro (como ("Amethyst Octopus", (1, 'F'))) e um lugar (como ("Seaside Cottages ", ('C', 1))), e devolve 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 pelo 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

Tenta implementar esta função como uma expressão case com um tuplo ad hoc, em vez de usares condicionais (isto é um idioma comum em Elm).

Editar via GitHub A ligação abre numa nova janela ou separador
Elm Exercism

Estás pronto para começar Caça ao Tesouro de Tisbury?

Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.