Trilhas
/
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 dado (ou vários), incluindo outras tuplas.

As tuplas são definidas como valores separados por vírgula entre os caracteres ( 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 elas são iguais só 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

Existem três formas de extrair valores de uma tupla:

  • As funções fst e snd
  • Desestruturaçã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

Azara e Rui são colegas de equipe competindo em uma caça ao tesouro com tema de piratas. Um tem uma lista de tesouros com coordenadas do mapa, o outro tem uma lista de nomes de locais com coordenadas do mapa. Eles também receberam mapas em branco com um ponto de partida marcado com VOCÊ ESTÁ AQUI.

Lista de Azara Lista de 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 de Azara parecem estar formatadas e ordenadas de maneira diferente das de Rui, e eles precisam ficar alternando entre uma lista e outra para descobrir quais tesouros combinam com quais locais. Como aspirantes a programadores de F#, eles vieram pedir sua ajuda para escrever um pequeno programa (na verdade, um conjunto de funções) para organizar melhor as informações da caça.

1. Extrair coordenadas

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

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

2. Formatar coordenadas

Implemente a função convertCoordinate() que recebe uma coordenada no formato "2A" e retorna uma tupla no formato (2, 'A').

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

3. Comparar coordenadas

Implemente a função compareRecords() que recebe um par (treasure, coordinate) e um registro (location, coordinate, quadrant) e compara as coordenadas de cada um. Retorne true se as coordenadas "combinarem", e retorne false se não combinarem. Reformate as coordenadas conforme necessário para uma comparação precisa.

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 registros correspondentes

Implemente a função createrecord() que recebe um par (treasure, coordinate) da lista de Azara e um registro (location, coordinate, quadrant) da lista de Rui e retorna (coordinate, location, quadrant, treasure) se as coordenadas combinarem. Se as coordenadas não combinarem, retorne uma tupla com o mesmo formato, mas preenchida com "". Reformate as coordenadas conforme necessário para uma comparação precisa.

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 O link abre em uma nova janela ou aba
F# Exercism

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

Crie sua conta no Exercism para aprender e dominar F# com 18 conceitos148 exercícios e mentoria humana de verdade, tudo de graça.