Percursos
/
Elixir
Elixir
/
Exercícios
/
Pontuação máxima
Pontuação máxima

Pontuação máxima

Exercício de aprendizagem

Introdução

Mapas

Os mapas em Elixir são a estrutura de dados para guardar informação em pares chave-valor. Noutras linguagens, também podem ser conhecidos como arrays associativos (PHP), hashes (Perl 5, Raku) ou dicionários (Python).

As chaves e os valores podem ser de qualquer tipo de dados, mas se a chave for um átomo podemos usar uma sintaxe abreviada. Os mapas não garantem a ordem das suas entradas quando são acedidos ou devolvidos.

Formas literais

Um mapa vazio declara-se simplesmente com %{}. Se quisermos adicionar itens a um mapa literal, podemos usar duas formas:

# If the key is an atom:
%{atom_key: 1}

# If the key is a different type:
%{1 => :atom_value}

# You can even mix these if the atom form comes second:
%{"first_form" => :a, atom_form: :b}

Embora não exista um formato canónico, escolhe uma forma consistente de representar os pares chave-valor literais.

Funções do módulo Map

O Elixir disponibiliza muitas funções para trabalhar com mapas no módulo Map. Algumas funções do módulo Map exigem que lhes seja passada uma função anónima para ajudar na transformação do mapa.

Atributos de módulo como constantes

Em Elixir, podemos definir atributos de módulo que podem ser usados como constantes nas nossas funções.

defmodule Example do
  # Defines the attribute as the value 1
  @constant_number 1

  def example_value() do
    # Returns the value 1
    @constant_number
  end
end

Quando são usados para definir constantes de módulo, os atributos podem ser qualquer expressão que possa ser avaliada em tempo de compilação. Depois da compilação, os atributos de módulo já não estão acessíveis, uma vez que são expandidos durante a compilação, à semelhança das macros definidas em linguagens como C.

Instruções

Neste exercício, vais implementar uma forma de acompanhar as pontuações máximas do jogo mais popular do salão de jogos da tua zona.

1. Define um novo mapa de pontuações máximas

Para criar um novo mapa de pontuações máximas, define a função HighScore.new/0, que não recebe argumentos e devolve um mapa de pontuações máximas novo e vazio.

HighScore.new()
# => %{}

2. Adiciona jogadores ao mapa de pontuações máximas

Para adicionar um jogador ao mapa de pontuações máximas, define HighScore.add_player/3, uma função que recebe 3 argumentos:

  • O primeiro argumento é o mapa de pontuações.
  • O segundo argumento é o nome de um jogador, como string.
  • O terceiro argumento é a pontuação, como número inteiro. O argumento é opcional; implementa o terceiro argumento com um valor predefinido de 0.

Guarda a pontuação inicial predefinida num atributo de módulo. Vais precisar dela outra vez.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 0, "José Valim"=> 486_373}

3. Remove jogadores do mapa de pontuações máximas

Para remover um jogador do mapa de pontuações máximas, define HighScore.remove_player/2, que recebe 2 argumentos:

  • O primeiro argumento é o mapa de pontuações.
  • O segundo argumento é o nome do jogador, como string.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.remove_player(score_map, "Dave Thomas")
# => %{}

4. Reinicia a pontuação de um jogador

Para reiniciar a pontuação de um jogador, define HighScore.reset_score/2, que recebe 2 argumentos:

  • O primeiro argumento é o mapa de pontuações.
  • O segundo argumento é o nome do jogador, como string, cuja pontuação queres reiniciar.

A função também deve funcionar se o jogador não tiver pontuação.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.reset_score(score_map, "José Valim")
# => %{"José Valim"=> 0}

5. Atualiza a pontuação de um jogador

Para atualizar a pontuação de um jogador somando à pontuação anterior, define HighScore.update_score/3, que recebe 3 argumentos:

  • O primeiro argumento é o mapa de pontuações.
  • O segundo argumento é o nome do jogador, como string, cuja pontuação queres atualizar.
  • O terceiro argumento é a pontuação que queres adicionar à pontuação máxima guardada.

A função também deve funcionar se o jogador não tiver uma pontuação anterior; assume que a pontuação anterior é 0.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.update_score(score_map, "José Valim", 5)
# => %{"José Valim"=> 486_378}

6. Obtém uma lista de jogadores

Para obteres uma lista de jogadores, define HighScore.get_players/1, que recebe 1 argumento:

  • O primeiro argumento é o mapa de pontuações.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas", 2_374)
# => %{"Dave Thomas" => 2_374}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 2_374, "José Valim"=> 486_373}
HighScore.get_players(score_map)
# => ["Dave Thomas", "José Valim"]
Editar via GitHub A ligação abre numa nova janela ou separador
Elixir Exercism

Estás pronto para começar Pontuação máxima?

Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.