Tracks
/
Elm
Elm
/
Ejercicios
/
La búsqueda del tesoro de Tisbury
La búsqueda del tesoro de Tisbury

La búsqueda del tesoro de Tisbury

Ejercicio de aprendizaje

Introducción

Tuplas

Las tuplas en Elm pueden contener dos o tres valores, y cada valor puede tener cualquier tipo. En Elm, las tuplas se usan principalmente para tipos transitorios simples. Por esta razón, las tuplas tienen un máximo de 3 valores y, como incentivo adicional, solo se proporcionan funciones de conveniencia para 2 valores. Para datos más complejos, es mejor pasar a los 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"

Las tuplas se pueden desestructurar en enlaces usando la coincidencia de patrones de tuplas. La desestructuración se puede hacer en expresiones let, declaraciones de funciones y sentencias 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

Instrucciones

Aazra y Rui están diseñando una búsqueda del tesoro con temática pirata. Una es una lista de tesoros con sus ubicaciones en el mapa; la otra, una lista de nombres de lugares con sus ubicaciones en el mapa.

Tesoro Ubicación
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)
Nombre del lugar Ubicación Cuadrante
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

Los jugadores recorrerán el mapa y recogerán tesoros a medida que avanzan. Las ubicaciones de los tesoros y de los lugares tienen formatos distintos, para añadir un desafío adicional. También hay algunos lugares especiales, donde ciertos tesoros se pueden intercambiar por otros, para darle un giro adicional al juego. Tu tarea es escribir funciones que les ayuden con su juego.

1. Convertir ubicaciones

Implementa la función placeLocationToTreasureLocation, que recibe una ubicación de lugar (como ('C', 1)) y la convierte en una ubicación de tesoro (como (1, 'C')).

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

2. Comparar ubicaciones de tesoros y de lugares

Implementa la función treasureLocationMatchesPlaceLocation, que recibe una PlaceLocation (como ('C', 1)) y devuelve true si coincide con una TreasureLocation (como (1, 'C')).

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

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

3. Contar ubicaciones de tesoros

Implementa la función countPlaceTreasures, que recibe un lugar (como ("Aqua Lagoon (Island of Mystery)", ('F', 1))) y la lista de tesoros, y devuelve la cantidad de tesoros que se pueden encontrar allí.

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

countPlaceTreasures place treasures =
--> 2

4. Lugares especiales

Implementa la función specialCaseSwapPossible, que recibe un tesoro (como ("Amethyst Octopus", (1, 'F'))) y un lugar (como ("Seaside Cottages ", ('C', 1))), y devuelve true para las siguientes combinaciones:

  • El Brass Spyglass se puede intercambiar por cualquier otro tesoro en el Abandoned Lighthouse
  • El Amethyst Octopus se puede intercambiar por el Crystal Crab o el Glass Starfish en el Stormy Breakwater
  • El Vintage Pirate Hat se puede intercambiar por el Model Ship in Large Bottle o el Antique Glass Fishnet Float en el Harbor Managers Office

Intenta implementar esta función como una sentencia case con una tupla ad hoc, en lugar de usar condicionales if (este es un modismo común en Elm).

Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Elm Exercism

¿Todo listo para empezar La búsqueda del tesoro de Tisbury?

Regístrate en Exercism para aprender y dominar Elm con 28 conceptos110 ejercicios y mentoría humana real, todo gratis.