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

Uma Tuple é bastante semelhante a um Vector (um array 1-D) em muitos aspetos. No entanto, há algumas diferenças importantes.

  • As tuplas escrevem-se entre parênteses ( ) em vez de parênteses retos [ ], embora os parênteses possam ser omitidos nos casos em que o significado não é ambíguo.
  • As tuplas não são obrigadas a 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 do que os vetores, por isso devem ser preferidas nos casos em que 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})

Existe também um construtor Tuple(), que transforma qualquer coleção iterável numa tupla. Convenientemente, isto trata uma string como uma coleção iterável de carateres.

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

Em qualquer tupla, é possível aceder aos 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 os arrays.

Desempacotamento

Uma tupla pode ser desempacotada em elementos individuais recorrendo a atribuição múltipla. Para os elementos que não são necessários, usa o sublinhado _ como variável fictícia.

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 está muito familiarizado com esta sintaxe de atribuição múltipla.

Tuplas nomeadas

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

Os campos individuais podem depois ser acedidos 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, precedido de dois pontos :), por isso também existe uma sintaxe alternativa:

julia> nt[:b]
7.3

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

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

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

julia> values(nt)
(1, 7.3)

Repara 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 neste caso de uso, pois proporciona segurança dos dados e permite otimizações mais agressivas do compilador.

Instruções

A Azara e o Rui são companheiros de equipa numa caça ao tesouro com tema pirata. Um tem uma lista de tesouros com coordenadas do mapa, o outro uma lista de nomes de locais com coordenadas do mapa. Também receberam mapas em branco com um ponto de partida marcado 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 saltar de uma lista para a outra para descobrir que tesouros correspondem a que locais. Como aspirantes a programadores de Julia, vieram pedir-te ajuda para escrever um pequeno programa (um conjunto de funções, na verdade) que organize melhor a informação da caça ao tesouro.

1. Extrair coordenadas

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

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

2. Formatar coordenadas

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

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

3. Corresponder coordenadas

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

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 registos correspondidos

Implementa a função create_record() 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 corresponderem.

Se as coordenadas não corresponderem, devolve um tuplo vazio. Reformata as coordenadas conforme for necessário para uma comparação exata.

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 A ligação abre numa nova janela ou separador
Julia Exercism

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

Inscreve-te no Exercism para aprenderes e dominares Julia com 35 conceitos128 exercícios, e mentoria humana real, tudo grátis.