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:
fst e snd
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
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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
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.
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"
Implemente a função convertCoordinate() que recebe uma coordenada no formato "2A" e retorna uma tupla no formato (2, 'A').
convertCoordinate "2A"
// (2, 'A')
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
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")
// ("", "", "", "")
Crie sua conta no Exercism para aprender e dominar F# com 18 conceitos148 exercícios e mentoria humana de verdade, tudo de graça.