Recordes

Recordes

Exercício de aprendizagem

Introdução

Tabelas hash

Tabelas hash em Common Lisp são estruturas de dados para armazenar dados associativos. Elas mapeiam chaves (que podem ser qualquer objeto) para valores (que também podem ser qualquer objeto). Outras linguagens podem se referir a esse conceito como mapas, dicionários ou hashes.

Criando tabelas hash

Tabelas hash podem ser criadas com a função make-hash-table.

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

(Repare que a apresentação impressa de uma tabela hash depende da implementação, então ela pode aparecer de forma diferente no seu REPL.)

Recuperando valores por chave

Para obter um valor a partir de uma chave na tabela hash, você usa a função gethash:

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

gethash retorna múltiplos valores, o que será explicado em outro conceito.

Inserindo valores

Para inserir um valor em uma tabela hash, você usa setf com gethash assim:

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

Isso modifica o valor da chave :foo na tabela hash *hash-table* para :bar. Isso retorna o valor.

O uso de setf será explicado em outro conceito.

Instruções

Lamont é um alienígena Lisp que quer criar o próprio videogame. Uma das tarefas com que ele pediu sua ajuda é manter o controle de uma lista de recordes.

1. Criando a tabela de recordes

Defina uma função make-high-score-table que não recebe nenhum argumento e resulta em uma nova tabela hash vazia:

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

2. Adicionando um jogador à tabela

Para adicionar um jogador à tabela, defina uma função add-player que recebe dois argumentos:

  • a tabela de recordes
  • o nome do jogador como uma keyword

Defina a pontuação inicial do jogador como zero.

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

3. Definindo a pontuação de um jogador

Para definir a pontuação de um jogador, defina uma função set-score que recebe três argumentos:

  • a tabela de recordes
  • o nome do jogador como uma keyword
  • a pontuação do jogador como um número inteiro
(set-score hash-table :louis 1234) ; => 1234

4. Obtendo uma pontuação na tabela

Para obter a pontuação de um jogador na tabela, defina uma função get-score que recebe dois argumentos:

  • a tabela de recordes
  • o nome do jogador como uma keyword

Essa função deve resultar na pontuação armazenada para o jogador. Se não houver pontuação armazenada para esse jogador, ou se ele ainda não estiver na tabela, o resultado deve ser 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. Removendo um jogador da tabela

Para remover um jogador da tabela de recordes, defina uma função remove-player que recebe dois argumentos:

  • a tabela de recordes
  • o nome do jogador como uma keyword

Essa função deve lidar sem problemas com casos em que o jogador ainda não foi adicionado à tabela. Obviamente, depois que um jogador é removido, se você obtiver a pontuação dele na tabela, ela será 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
Editar via GitHub O link abre em uma nova janela ou aba
Common Lisp Exercism

Tudo pronto para começar Recordes?

Crie sua conta no Exercism para aprender e dominar Common Lisp com 27 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.