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

Uma tupla é um agrupamento imutável de valores sem nome, mas ordenados. As tuplas podem conter qualquer tipo de dados (ou vários), incluindo outras tuplas.

As tuplas definem-se como valores separados por vírgulas entre os carateres ( e ): (<element_1>, ... , <element_n>).

("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)

Só é possível comparar tuplas com o mesmo comprimento e os mesmos tipos (na mesma ordem). As tuplas têm igualdade estrutural, o que significa que só são iguais se todos os seus valores forem iguais.

(1, 2) = (1, 2) // Same length, same types, same values, same order
// => true

(1, 2) = (2, 1) // Same length, same types, same values, different order
// => false

(1, 2) = (1, "2") // Same length, different types
// compiler error

(1, 2) = (1, 2, 3) // Different length
// compiler error

Há três formas de extrair valores de uma tupla:

  • As funções fst e snd
  • Desconstrução de tuplas
  • Correspondência de padrões
let person = ("Jordan", 170)

// Option 1: fst/snd
let name1 = fst person
let length2 = snd person

// Option 2: deconstruction
let (name2, length2) = person
// => name2 = "Jordan"
// => length2 = 170

// Option 3: pattern matching
match person with
| name3, length3 -> printf "%s: %d" name3 length3

Instruções

A Azara e o Rui são colegas de equipa numa caça ao tesouro com tema de piratas. Um tem uma lista de tesouros com coordenadas de mapa, o outro tem uma lista de nomes de locais com coordenadas de mapa. Também lhes foram dados mapas em branco com um ponto de partida assinalado com ESTÁS AQUI.

Lista da Azara Lista do Rui
Tesouro Coordenadas
Amethyst Octopus 1F
Angry Monkey Figurine 5B
Antique Glass Fishnet Float 3D
Brass Spyglass 4B
Carved Wooden Elephant 8C
Crystal Crab 6A
Glass Starfish 6D
Model Ship in Large Bottle 8A
Pirate Flag 7F
Robot Parrot 1C
Scrimshaw Whale's Tooth 2A
Silver Seahorse 4E
Vintage Pirate Hat 7E
Nome do Local Coordenadas Quadrante
Seaside Cottages (1, 'C') Blue
Aqua Lagoon (Island of Mystery) (1, 'F') Yellow
Deserted Docks (2, 'A') Blue
Spiky Rocks (3, 'D') Yellow
Abandoned Lighthouse (4, 'B') Blue
Hidden Spring (Island of Mystery) (4, 'E') Yellow
Stormy Breakwater (5, 'B') Purple
Old Schooner (6, 'A') Purple
Tangled Seaweed Patch (6, 'D') Orange
Quiet Inlet (Island of Mystery) (7, 'E') Orange
Windswept Hilltop (Island of Mystery) (7, 'F') Orange
Harbor Managers Office (8, 'A') Purple
Foggy Seacave (8, 'C') Purple

Mas as coisas estão um pouco desorganizadas: as coordenadas da Azara parecem estar formatadas e ordenadas de forma diferente das do Rui, e têm de andar sempre a olhar de uma lista para a outra para perceber que tesouros correspondem a que locais. Como fsharpies principiantes, vieram pedir-te ajuda para escreveres um pequeno programa (na verdade, um conjunto de funções) que organize melhor a informação da sua caça ao tesouro.

1. Extrair as coordenadas

Implementa a função getCooordinate() que recebe um par (treasure, coordinate) da lista da Azara e devolve apenas a coordenada do mapa extraída.

getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"

2. Formatar as coordenadas

Implementa a função convertCoordinate() que recebe uma coordenada no formato "2A" e devolve um tuplo no formato (2, 'A').

convertCoordinate "2A"
// (2, 'A')

3. Comparar as coordenadas

Implementa a função compareRecords() que recebe um par (treasure, coordinate) e um registo (location, coordinate, quadrant) e compara as coordenadas de cada um. Devolve true se as coordenadas coincidirem e false se não coincidirem. Reformata as coordenadas conforme for necessário para uma comparação exata.

compareRecords ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "blue")
// false

compareRecords ("Model Ship in Large Bottle", "8A") ("Harbor Managers Office", (8, 'A'), "purple")
// true

4. Combinar os registos coincidentes

Implementa a função createrecord() que recebe um par (treasure, coordinate) da lista da Azara e um registo (location, coordinate, quadrant) da lista do Rui e devolve (coordinate, location, quadrant, treasure) se as coordenadas coincidirem. Se as coordenadas não coincidirem, devolve um tuplo com a mesma forma mas preenchido com "". Reformata as coordenadas conforme for necessário para uma comparação exata.

createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")

createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Editar via GitHub A ligação abre numa nova janela ou separador
F# Exercism

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

Inscreve-te no Exercism para aprenderes e dominares F# com 18 conceitos148 exercícios, e mentoria humana real, tudo grátis.