Треки
/
Common Lisp
Common Lisp
/
Вправи
/
Рекордні результати
Рекордні результати

Рекордні результати

Навчальна вправа

Вступ

Хеш-таблиці

Хеш-таблиці в Common Lisp - це структури даних для зберігання асоціативних даних. Вони зіставляють ключі (якими може бути будь-який обʼєкт) зі значеннями (якими теж може бути будь-який обʼєкт). В інших мовах цю концепцію можуть називати мапами, словниками або хешами.

Створення хеш-таблиць

Хеш-таблиці можна створювати за допомогою функції make-hash-table.

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

(Зауважте, що надруковане представлення хеш-таблиці залежить від реалізації, тож у REPL вона може мати інший вигляд.)

Отримання значень за ключами

Щоб отримати значення за ключем із хеш-таблиці, ми використовуємо функцію gethash:

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

gethash повертає кілька значень, про які йтиметься в іншій концепції.

Вставлення значень

Щоб вставити значення в хеш-таблицю, ми використовуємо setf разом із gethash ось так:

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

Це змінить значення для ключа :foo у хеш-таблиці *hash-table* на :bar. Воно повертає це значення.

Використання setf буде пояснено в іншій концепції.

Вказівки

Ламонт - прибулець із Ліспу, який хоче написати власну відеогру. Одне із завдань, у якому знадобиться наша допомога, - ведення списку рекордів.

1. Створення таблиці рекордів

Визначте функцію make-high-score-table, яка не приймає жодних аргументів, а повертає нову порожню хеш-таблицю:

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

2. Додавання гравця до таблиці

Щоб додати гравця до таблиці, визначте функцію add-player, яка приймає два аргументи:

  • таблицю рекордів
  • імʼя гравця як ключове слово

Встановіть початковий рахунок гравця рівним нулю.

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

3. Встановлення рахунку гравця

Щоб задати рахунок гравця, визначте функцію set-score, яка приймає три аргументи:

  • таблицю рекордів
  • імʼя гравця як ключове слово
  • рахунок гравця як ціле число
(set-score hash-table :louis 1234) ; => 1234

4. Отримання рахунку з таблиці

Щоб отримати рахунок гравця з таблиці, визначте функцію get-score, яка приймає два аргументи:

  • таблицю рекордів
  • імʼя гравця як ключове слово

Ця функція повинна повертати рахунок, збережений для гравця. Якщо для цього гравця рахунок не збережено або цього гравця ще немає в таблиці, вона повинна повертати 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. Видалення гравця з таблиці

Щоб видалити гравця з таблиці рекордів, визначте функцію remove-player, яка приймає два аргументи:

  • таблицю рекордів
  • імʼя гравця як ключове слово

Ця функція повинна коректно обробляти випадки, коли гравця ще не додано до таблиці. Звісно, якщо після видалення гравця ми запитаємо його рахунок із таблиці, він дорівнюватиме нулю.

(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
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Common Lisp Exercism

Час розпочати Рекордні результати?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Common Lisp, а також 27 концепцій92 вправи та справжнє наставництво від людей, і все це безкоштовно.