Tracks
/
Common Lisp
Common Lisp
/
Ejercicios
/
Puntajes altos
Puntajes altos

Puntajes altos

Ejercicio de aprendizaje

Introducción

Tablas hash

Las tablas hash en 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 pueden referirse a este concepto como mapas, diccionarios o hashes.

Cómo crear 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 presentación impresa de una tabla hash depende de la implementación, así que puede verse diferente en tu REPL.)

Cómo obtener valores por clave

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

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

gethash devuelve múltiples valores, lo cual se explicará en otro concepto.

Cómo insertar valores

Para insertar un valor en una tabla hash, usas setf junto con gethash de esta manera:

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

Esto modificará el valor de la clave :foo en la tabla hash *hash-table* para que sea :bar. Devuelve el 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 pidió ayuda es llevar un registro de la lista de puntajes altos.

1. Crear la tabla de puntajes altos

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. Agregar un jugador a la tabla

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

  • la tabla de puntajes altos
  • el nombre del jugador como palabra clave

Establece el puntaje inicial del jugador en cero.

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

3. Establecer el puntaje de un jugador

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

  • la tabla de puntajes altos
  • el nombre del jugador como palabra clave
  • el puntaje del jugador como un entero
(set-score hash-table :louis 1234) ; => 1234

4. Obtener un puntaje de la tabla

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

  • la tabla de puntajes altos
  • el nombre del jugador como palabra clave

Esta función debe evaluar al puntaje almacenado para el jugador. Si no hay un puntaje almacenado para ese jugador, o si el 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 puntajes altos, define una función remove-player que recibe dos argumentos:

  • la tabla de puntajes altos
  • el nombre del jugador como palabra clave

Esta función debe manejar sin problemas los casos en los que el jugador todavía no se agregó a la tabla. Obviamente, después de eliminar a un jugador, si se obtiene su puntaje de la tabla, este 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 una pestaña nuevas
Common Lisp Exercism

¿Todo listo para empezar Puntajes altos?

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