Track
/
Common Lisp
Common Lisp
/
Esercizi
/
Punteggi migliori
Punteggi migliori

Punteggi migliori

Esercizio di apprendimento

Introduzione

Tabelle hash

Le tabelle hash in Common Lisp sono strutture dati per memorizzare dati associativi. Mappano chiavi (che possono essere qualsiasi oggetto) a valori (che possono essere qualsiasi oggetto). Altri linguaggi possono riferirsi a questo concetto con i nomi «map», «dictionary» o «hash».

Creare tabelle hash

Le tabelle hash si possono creare con la funzione make-hash-table.

(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>

(Nota: la rappresentazione stampata di una tabella hash dipende dall'implementazione, quindi potrebbe apparire diversamente nella tua REPL.)

Ottenere i valori tramite le chiavi

Per ottenere un valore a partire da una chiave della tabella hash si usa la funzione gethash:

*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
                   ;    T

gethash restituisce valori multipli, che saranno spiegati in un altro concetto.

Inserire valori

Per inserire un valore in una tabella hash si usa setf insieme a gethash, così:

(setf (gethash :foo *hash-table*) :bar) : => :bar

Questo modifica il valore della chiave :foo nella tabella hash *hash-table* impostandolo a :bar. Restituisce il valore.

L'uso di setf sarà spiegato in un altro concetto.

Istruzioni

Lamont è un alieno Lisp che vuole scrivere il proprio videogioco. Un compito per cui ti ha chiesto aiuto è tenere traccia di una lista di punteggi migliori.

1. Creare la tabella dei punteggi

Definisci una funzione make-high-score-table che non prende alcun argomento e restituisce una nuova tabella hash vuota:

(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>

2. Aggiungere un giocatore alla tabella

Per aggiungere un giocatore alla tabella, definisci una funzione add-player che prende due argomenti:

  • la tabella dei punteggi
  • il nome del giocatore come keyword

Imposta il punteggio iniziale del giocatore a zero.

(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0

3. Impostare il punteggio di un giocatore

Per impostare il punteggio di un giocatore, definisci una funzione set-score che prende tre argomenti:

  • la tabella dei punteggi
  • il nome del giocatore come keyword
  • il punteggio del giocatore come numero intero
(set-score hash-table :louis 1234) ; => 1234

4. Ottenere un punteggio dalla tabella

Per ottenere dalla tabella il punteggio di un giocatore, definisci una funzione get-score che prende due argomenti:

  • la tabella dei punteggi
  • il nome del giocatore come keyword

Questa funzione dovrebbe restituire il punteggio memorizzato per il giocatore. Se non c'è alcun punteggio memorizzato per quel giocatore, o se quel giocatore non è ancora nella tabella, allora deve restituire 0.

(get-score hash-table :louis)                         ; => 1234
(get-score hash-table :lilly)                         ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0

5. Rimuovere un giocatore dalla tabella

Per rimuovere un giocatore dalla tabella dei punteggi, definisci una funzione remove-player che prende due argomenti:

  • la tabella dei punteggi
  • il nome del giocatore come keyword

Questa funzione dovrebbe gestire senza problemi i casi in cui il giocatore non è ancora stato aggiunto alla tabella. Ovviamente, dopo che un giocatore è stato rimosso, se si ottiene il suo punteggio dalla tabella, questo sarà zero.

(set-score hash-table :louis 1234)           ; => 1234
(remove-player hash-table :louis)            ; => T
(get-score hash-table :louis)                ; => 0

(remove-player hash-table :not-in-the-table) ; => NIL
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Common Lisp Exercism

Vuoi iniziare Punteggi migliori?

Iscriviti a Exercism per imparare e padroneggiare Common Lisp con 27 concetti92 esercizi e il mentoring di persone reali, tutto gratis.