Track
/
Elixir
Elixir
/
Esercizi
/
Punteggio più alto
Punteggio più alto

Punteggio più alto

Esercizio di apprendimento

Introduzione

Mappe

Le mappe in Elixir sono la struttura dati per memorizzare informazioni in coppie chiave-valore. In altri linguaggi, queste potrebbero anche essere note come array associativi (PHP), hash (Perl 5, Raku) o dizionari (Python).

Chiavi e valori possono essere di qualsiasi tipo di dato, ma se la chiave è un atomo possiamo usare una sintassi abbreviata. Le mappe non garantiscono l'ordine delle loro voci quando vengono consultate o restituite.

Forme letterali

Una mappa vuota si dichiara semplicemente con %{}. Se vogliamo aggiungere elementi a una mappa letterale, possiamo usare due forme:

# 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}

Anche se non esiste un formato canonico, scegli un modo coerente per rappresentare le coppie chiave-valore letterali.

Funzioni del modulo Map

Elixir fornisce molte funzioni per lavorare con le mappe nel modulo Map. Alcune funzioni del modulo Map richiedono che venga passata una funzione anonima per assistere nella trasformazione della mappa.

Attributi di modulo come costanti

In Elixir, possiamo definire attributi di modulo che possono essere usati come costanti nelle nostre funzioni.

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 vengono usati per definire costanti di modulo, gli attributi possono essere qualsiasi espressione che possa essere valutata al momento della compilazione. Dopo la compilazione, gli attributi di modulo non sono accessibili poiché vengono espansi durante la compilazione, in modo simile alle macro definite in linguaggi come C.

Istruzioni

In questo esercizio implementerai un modo per tenere traccia dei punteggi più alti del gioco più popolare della tua sala giochi.

1. Definisci una nuova mappa dei punteggi più alti

Per creare una nuova mappa dei punteggi più alti, definisci la funzione HighScore.new/0, che non accetta argomenti e restituisce una nuova mappa vuota dei punteggi.

HighScore.new()
# => %{}

2. Aggiungi giocatori alla mappa dei punteggi

Per aggiungere un giocatore alla mappa dei punteggi, definisci HighScore.add_player/3, una funzione che accetta 3 argomenti:

  • Il primo argomento è la mappa dei punteggi.
  • Il secondo argomento è il nome di un giocatore, come stringa.
  • Il terzo argomento è il punteggio, come numero intero. L'argomento è opzionale: implementa il terzo argomento con un valore predefinito di 0.

Memorizza il punteggio iniziale predefinito in un attributo del modulo. Servirà di nuovo.

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. Rimuovi giocatori dalla mappa dei punteggi

Per rimuovere un giocatore dalla mappa dei punteggi, definisci HighScore.remove_player/2, che accetta 2 argomenti:

  • Il primo argomento è la mappa dei punteggi.
  • Il secondo argomento è il nome del giocatore, come stringa.
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. Reimposta il punteggio di un giocatore

Per reimpostare il punteggio di un giocatore, definisci HighScore.reset_score/2, che accetta 2 argomenti:

  • Il primo argomento è la mappa dei punteggi.
  • Il secondo argomento è il nome del giocatore, come stringa, di cui vuoi reimpostare il punteggio.

La funzione deve funzionare anche se il giocatore non ha un punteggio.

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. Aggiorna il punteggio di un giocatore

Per aggiornare il punteggio di un giocatore aggiungendo al punteggio precedente, definisci HighScore.update_score/3, che accetta 3 argomenti:

  • Il primo argomento è la mappa dei punteggi.
  • Il secondo argomento è il nome del giocatore, come stringa, di cui vuoi aggiornare il punteggio.
  • Il terzo argomento è il punteggio che vuoi aggiungere al punteggio più alto memorizzato.

La funzione deve funzionare anche se il giocatore non ha un punteggio precedente: in quel caso, presupponi che il punteggio precedente sia 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. Ottieni una lista di giocatori

Per ottenere una lista di giocatori, definisci HighScore.get_players/1, che accetta 1 argomento:

  • Il primo argomento è la mappa dei punteggi.
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"]
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elixir Exercism

Vuoi iniziare Punteggio più alto?

Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.