Tracks
/
Elixir
Elixir
/
Ejercicios
/
Puntaje alto
Puntaje alto

Puntaje alto

Ejercicio de aprendizaje

Introducción

Mapas

Los mapas en Elixir son la estructura de datos que sirve para almacenar información en pares clave-valor. En otros lenguajes también se los conoce 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 al acceder a ellas o al devolverlas.

Formas literales

Un mapa vacío simplemente se declara con %{}. Si queremos agregar elementos a un mapa literal, 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 clave-valor literales.

Funciones del módulo Map

Elixir ofrece 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 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, los atributos de módulo ya no son accesibles, 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 los puntajes altos del juego más popular de tu salón de arcade local.

1. Define un nuevo mapa de puntajes altos

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

HighScore.new()
# => %{}

2. Agrega jugadores al mapa de puntajes altos

Para agregar un jugador al mapa de puntajes altos, define HighScore.add_player/3, una función que recibe 3 argumentos:

  • El primer argumento es el mapa de puntajes.
  • El segundo argumento es el nombre de un jugador como string.
  • El tercer argumento es el puntaje como entero. El argumento es opcional; implementa el tercer argumento con un valor predeterminado de 0.

Guarda el puntaje inicial predeterminado en un atributo de módulo. Lo vas a necesitar 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 puntajes

Para eliminar a un jugador del mapa de puntajes altos, define HighScore.remove_player/2, que recibe 2 argumentos:

  • El primer argumento es el mapa de puntajes.
  • 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. Reinicia el puntaje de un jugador

Para reiniciar el puntaje de un jugador, define HighScore.reset_score/2, que recibe 2 argumentos:

  • El primer argumento es el mapa de puntajes.
  • El segundo argumento es el nombre del jugador como string, cuyo puntaje quieres reiniciar.

La función también debe funcionar si el jugador no tiene un puntaje.

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 el puntaje de un jugador

Para actualizar el puntaje de un jugador sumándole al puntaje anterior, define HighScore.update_score/3, que recibe 3 argumentos:

  • El primer argumento es el mapa de puntajes.
  • El segundo argumento es el nombre del jugador como string, cuyo puntaje quieres actualizar.
  • El tercer argumento es el puntaje que quieres sumar al puntaje alto almacenado.

La función también debe funcionar si el jugador no tiene un puntaje anterior; asume que el puntaje anterior 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 puntajes.
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 una pestaña nuevas
Elixir Exercism

¿Todo listo para empezar Puntaje alto?

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