Parcours
/
Common Lisp
Common Lisp
/
Exercices
/
Meilleurs scores
Meilleurs scores

Meilleurs scores

Exercice d'apprentissage

Introduction

Tables de hachage

Les tables de hachage en Common Lisp sont des structures de données qui permettent de stocker des données associatives. Elles associent des clés (qui peuvent être n'importe quel objet) à des valeurs (qui peuvent être n'importe quel objet). D'autres langages donnent à ce concept le nom de map, dictionary ou hash.

Crée des tables de hachage

On peut créer des tables de hachage avec la fonction make-hash-table.

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

(Note que la représentation affichée d'une table de hachage dépend de l'implémentation, elle peut donc être différente dans le REPL.)

Récupère des valeurs à partir des clés

Pour récupérer une valeur à partir d'une clé dans la table de hachage, on utilise la fonction gethash :

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

gethash renvoie plusieurs valeurs, ce qui sera expliqué dans un autre concept.

Insère des valeurs

Pour insérer une valeur dans une table de hachage, on utilise setf avec gethash comme ceci :

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

Cela remplace par :bar la valeur associée à la clé :foo dans la table de hachage *hash-table*. Elle renvoie la valeur.

L'utilisation de setf sera expliquée dans un autre concept.

Instructions

Lamont est un alien Lisp qui veut écrire son propre jeu vidéo. L'une des tâches pour lesquelles il t'a demandé de l'aide consiste à tenir une liste des meilleurs scores.

1. Crée la table des meilleurs scores

Définis une fonction make-high-score-table qui ne prend aucun argument et renvoie une nouvelle table de hachage vide :

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

2. Ajoute un joueur à la table

Pour ajouter un joueur à la table, définis une fonction add-player qui prend deux arguments :

  • la table des meilleurs scores
  • le nom du joueur sous forme de mot-clé

Initialise le score du joueur à zéro.

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

3. Définis le score d'un joueur

Pour définir le score d'un joueur, définis une fonction set-score qui prend trois arguments :

  • la table des meilleurs scores
  • le nom du joueur sous forme de mot-clé
  • le score du joueur sous forme d'entier
(set-score hash-table :louis 1234) ; => 1234

4. Récupère un score depuis la table

Pour récupérer le score d'un joueur depuis la table, définis une fonction get-score qui prend deux arguments :

  • la table des meilleurs scores
  • le nom du joueur sous forme de mot-clé

Cette fonction doit renvoyer le score enregistré pour le joueur. Si aucun score n'est enregistré pour ce joueur, ou si ce joueur n'est pas encore dans la table, elle doit renvoyer 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. Supprime un joueur de la table

Pour supprimer un joueur de la table des meilleurs scores, définis une fonction remove-player qui prend deux arguments :

  • la table des meilleurs scores
  • le nom du joueur sous forme de mot-clé

Cette fonction doit gérer proprement les cas où le joueur n'a pas encore été ajouté à la table. Évidemment, une fois qu'un joueur est supprimé, si on récupère son score depuis la table, celui-ci vaudra zéro.

(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
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Common Lisp Exercism

Prêt à commencer Meilleurs scores ?

Inscris-toi sur Exercism pour apprendre et maîtriser Common Lisp avec 27 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.