Rutas
/
Elixir
Elixir
/
Ejercicios
/
Puntuación máxima
Puntuación máxima

Puntuación máxima

Ejercicio de aprendizaje

Introducción

Mapas

Los mapas en Elixir son la estructura de datos para almacenar información en pares clave-valor. En otros lenguajes, también pueden conocerse como arrays asociativos (PHP), hashes (Perl 5, Raku) o diccionarios (Python).

Las claves y los valores pueden ser de cualquier tipo de dato, pero si la clave es un átomo podemos usar una sintaxis abreviada. Los mapas no garantizan el orden de sus entradas cuando se accede a ellas o se devuelven.

Formas literales

Un mapa vacío se declara simplemente con %{}. Si queremos añadir elementos a un literal de mapa, podemos usar dos 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}

Aunque no existe un formato canónico, elige una forma consistente de representar los pares literales de clave-valor.

Funciones del módulo Map

Elixir proporciona muchas funciones para trabajar con mapas en el módulo Map. Algunas funciones del módulo Map requieren que se pase una función anónima a la función para ayudar con la transformación del mapa.

Atributos de módulo como constantes

En Elixir, podemos definir atributos de módulo que se pueden usar como constantes en nuestras funciones.

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

Cuando se usan para definir constantes de módulo, los atributos pueden ser cualquier expresión que se pueda evaluar en tiempo de compilación. Después de la compilación, no se puede acceder a los atributos de módulo, ya que se expanden durante la compilación, de forma similar a las macros definidas en lenguajes como C.

Instrucciones

En este ejercicio vas a implementar una forma de llevar un registro de las puntuaciones máximas del juego más popular de tu salón recreativo.

1. Define un nuevo mapa de puntuaciones máximas

Para crear un nuevo mapa de puntuaciones máximas, define la función HighScore.new/0, que no recibe ningún argumento y devuelve un mapa de puntuaciones máximas nuevo y vacío.

HighScore.new()
# => %{}

2. Añade jugadores al mapa de puntuaciones máximas

Para añadir un jugador al mapa de puntuaciones máximas, define HighScore.add_player/3, una función que recibe 3 argumentos:

  • El primer argumento es el mapa de puntuaciones.
  • El segundo argumento es el nombre de un jugador como string.
  • El tercer argumento es la puntuación como número entero. El argumento es opcional; implementa el tercer argumento con un valor predeterminado de 0.

Guarda la puntuación inicial predeterminada en un atributo de módulo. La necesitarás de nuevo.

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. Elimina jugadores del mapa de puntuaciones

Para eliminar un jugador del mapa de puntuaciones máximas, define HighScore.remove_player/2, que recibe 2 argumentos:

  • El primer argumento es el mapa de puntuaciones.
  • El segundo argumento es el nombre del jugador 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. Restablece la puntuación de un jugador

Para restablecer la puntuación de un jugador, define HighScore.reset_score/2, que recibe 2 argumentos:

  • El primer argumento es el mapa de puntuaciones.
  • El segundo argumento es el nombre del jugador como string, cuya puntuación quieres restablecer.

La función también debe funcionar si el jugador no tiene una puntuación.

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. Actualiza la puntuación de un jugador

Para actualizar la puntuación de un jugador sumándole la puntuación anterior, define HighScore.update_score/3, que recibe 3 argumentos:

  • El primer argumento es el mapa de puntuaciones.
  • El segundo argumento es el nombre del jugador como string, cuya puntuación quieres actualizar.
  • El tercer argumento es la puntuación que quieres añadir a la puntuación máxima almacenada.

La función también debe funcionar si el jugador no tiene una puntuación previa: asume que la puntuación previa es 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én una lista de jugadores

Para obtener una lista de jugadores, define HighScore.get_players/1, que recibe 1 argumento:

  • El primer argumento es el mapa de puntuaciones.
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 en GitHub El enlace se abre en una ventana o pestaña nueva
Elixir Exercism

¿Listo para empezar Puntuación máxima?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.