Trilhas
/
Julia
Julia
/
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

Um Tuple é bastante parecido com um Vector (um array unidimensional) em muitos aspectos. No entanto, há algumas diferenças importantes.

  • As tuplas são escritas entre parênteses ( ) em vez de colchetes [ ], embora os parênteses possam ser omitidos quando o significado não é ambíguo.
  • As tuplas não precisam ser homogêneas: o tipo de cada elemento é armazenado de forma independente.
  • As tuplas são imutáveis.

A imutabilidade permite mais otimizações do compilador e torna as tuplas mais eficientes que os vetores, então elas devem ser preferidas quando a mutabilidade não é necessária.

julia> t = (3, 5.2, "xyz")
(3, 5.2, "xyz")

# Non-homogeneous:
julia> dump(t)
Tuple{Int64, Float64, String}
  1: Int64 3
  2: Float64 5.2
  3: String "xyz"

julia> t[2]
5.2

# Immutable:
julia> t[2] = 7.3
ERROR: MethodError: no method matching setindex!(::Tuple{Int64, Float64, String})

Também existe um construtor Tuple(), que transforma qualquer coleção iterável em uma tupla. De forma útil, ele trata uma string como uma coleção iterável de caracteres.

julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')

Para qualquer tupla, é possível acessar os elementos por índice ou iterar sobre eles.

Qualquer tupla puramente numérica também pode ser usada em funções matemáticas como sum(), exatamente como arrays.

Desempacotamento

Uma tupla pode ser desempacotada em elementos individuais usando atribuição múltipla. Para elementos que não são necessários, use o sublinhado _ como variável descartável.

julia> tup = (1, "Julia", true)
(1, "Julia", true)

julia> num, name, _ = tup
(1, "Julia", true)

julia> uppercase(name), 2num
("JULIA", 2)

Quem programa em Python já conhece bem essa sintaxe de atribuição múltipla.

Tuplas nomeadas

Um Tuple contém apenas valores. Um NamedTuple associa cada valor a um nome.

Os campos individuais podem então ser acessados com a notação de "ponto":

julia> nt = (a = 1, b = 7.3)
(a = 1, b = 7.3)

julia> dump(nt)
@NamedTuple{a::Int64, b::Float64}
  a: Int64 1
  b: Float64 7.3

julia> nt.b
7.3

O nome é armazenado internamente como um Symbol (um tipo imutável, prefixado com dois-pontos :), então há uma sintaxe alternativa disponível:

julia> nt[:b]
7.3

É fácil obter os nomes (também chamados de "chaves") ou os valores separadamente:

julia> nt
(a = 1, b = 7.3)

julia> keys(nt)
(:a, :b)

julia> values(nt)
(1, 7.3)

Repare que a iteração sobre uma tupla nomeada produz apenas os valores, e os nomes são ignorados.

As tuplas (nomeadas ou não) são uma forma muito comum de transferir dados estruturados de e para funções. A imutabilidade é boa nesse caso, pois oferece segurança dos dados e permite otimizações mais agressivas do compilador.

Instruções

Azara e Rui são colegas de equipe competindo em uma caçada ao tesouro com tema de piratas. Um tem uma lista de tesouros com coordenadas no mapa, o outro uma lista de nomes de locais com coordenadas no mapa. Também receberam mapas em branco com um ponto de partida marcado como VOCÊ ESTÁ 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 não param de olhar de uma lista para a outra para descobrir quais tesouros vão com quais locais. Como estão começando a programar em Julia, vieram até você para pedir ajuda na escrita de um pequeno programa (na verdade, um conjunto de funções) para organizar melhor as informações da caçada.

1. Extrair coordenadas

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

julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"

2. Formatar coordenadas

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

julia> convert_coordinate("2A")
('2', 'A')

3. Comparar coordenadas

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

julia> compare_records(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "blue"))
false

julia> compare_records(("Model Ship in Large Bottle", "8A"), ("Harbor Managers Office", ('8', 'A'), "purple"))
true

4. Combinar registros correspondentes

Implemente a função create_record(), que recebe um par (treasure, coordinate) da lista da Azara e um registro (location, coordinate, quadrant) da lista do Rui e retorna (coordinate, location, quadrant, treasure) se as coordenadas coincidirem.

Se as coordenadas não coincidirem, retorne uma tupla vazia. Reformate as coordenadas conforme necessário para uma comparação precisa.

julia> create_record(("Brass Spyglass", "4B"), ("Abandoned Lighthouse", ('4', 'B'), "Blue"))
("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")

julia> create_record(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "Blue"))
()
Editar via GitHub O link abre em uma nova janela ou aba
Julia Exercism

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

Crie sua conta no Exercism para aprender e dominar Julia com 35 conceitos128 exercícios e mentoria humana de verdade, tudo de graça.