Rutas
/
Common Lisp
Common Lisp
/
Ejercicios
/
Puntuaciones máximas
Puntuaciones máximas

Puntuaciones máximas

Ejercicio de aprendizaje

Introducción

Tablas hash

Las tablas hash de Common Lisp son estructuras de datos para almacenar datos asociativos. Asocian claves (que pueden ser cualquier objeto) con valores (que también pueden ser cualquier objeto). Otros lenguajes se refieren a este concepto como mapas, diccionarios o hashes.

Creación de tablas hash

Las tablas hash se pueden crear con la función make-hash-table.

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

(Ten en cuenta que la representación impresa de una tabla hash depende de la implementación, por lo que puede aparecer de forma distinta en tu REPL).

Recuperar valores por clave

Para obtener un valor a partir de una clave de la tabla hash, usa la función gethash:

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

gethash devuelve varios valores, que se explican en otro concepto.

Insertar valores

Para insertar un valor en una tabla hash, usa setf junto con gethash así:

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

Esto modifica el valor de la clave :foo en la tabla hash *hash-table* para que sea :bar. Devuelve ese valor.

El uso de setf se explicará en otro concepto.

Instrucciones

Lamont es un alienígena de Lisp que quiere escribir su propio videojuego. Una de las tareas para las que te ha pedido ayuda es llevar un registro de una lista de puntuaciones altas.

1. Crear la tabla de puntuaciones altas

Define una función make-high-score-table que no recibe ningún argumento y evalúa a una nueva tabla hash vacía:

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

2. Añadir un jugador a la tabla

Para añadir un jugador a la tabla, define una función add-player que recibe dos argumentos:

  • la tabla de puntuaciones altas
  • el nombre del jugador como una palabra clave

Establece la puntuación inicial del jugador a cero.

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

3. Establecer la puntuación de un jugador

Para establecer la puntuación de un jugador, define una función set-score que recibe tres argumentos:

  • la tabla de puntuaciones altas
  • el nombre del jugador como una palabra clave
  • la puntuación del jugador como un número entero
(set-score hash-table :louis 1234) ; => 1234

4. Obtener una puntuación de la tabla

Para obtener la puntuación de un jugador de la tabla, define una función get-score que recibe dos argumentos:

  • la tabla de puntuaciones altas
  • el nombre del jugador como una palabra clave

Esta función debe evaluar a la puntuación almacenada para el jugador. Si no hay una puntuación almacenada para ese jugador, o ese jugador todavía no está en la tabla, debe evaluar a 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. Eliminar a un jugador de la tabla

Para eliminar a un jugador de la tabla de puntuaciones altas, define una función remove-player que recibe dos argumentos:

  • la tabla de puntuaciones altas
  • el nombre del jugador como una palabra clave

Esta función debe gestionar con elegancia los casos en los que el jugador aún no se ha añadido a la tabla. Obviamente, después de eliminar a un jugador, si se obtiene su puntuación de la tabla, será cero.

(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
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Common Lisp Exercism

¿Listo para empezar Puntuaciones máximas?

Regístrate en Exercism para aprender y dominar Common Lisp con 27 conceptos92 ejercicios y mentoría humana real, todo gratis.