トラック
/
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は複数の値を返します。これについては別の概念で説明します。

値の挿入

ハッシュテーブルに値を挿入するには、gethashと組み合わせてsetfを次のように使います。

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

これはハッシュテーブル*hash-table*にあるキー:fooの値を:barに変更します。 そしてその値を返します。

setfの使い方については、別の概念で説明します。

説明

Lamontは、自分でビデオゲームを作りたいと思っているLispの宇宙人です。そのうちの1つとして、ハイスコアリストを管理するというタスクの手伝いを頼まれています。

1. ハイスコアテーブルを作成する

引数を一切取らず、新しい空のハッシュテーブルに評価される関数make-high-score-tableを定義します。

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

2. テーブルにプレイヤーを追加する

テーブルにプレイヤーを追加するには、次の2つの引数を取る関数add-playerを定義します。

  • ハイスコアテーブル
  • キーワードで表したプレイヤーの名前

プレイヤーの初期スコアは0に設定します。

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

3. プレイヤーのスコアを設定する

プレイヤーのスコアを設定するには、次の3つの引数を取る関数set-scoreを定義します。

  • ハイスコアテーブル
  • キーワードで表したプレイヤーの名前
  • 整数で表したプレイヤーのスコア
(set-score hash-table :louis 1234) ; => 1234

4. テーブルからスコアを取得する

テーブルからプレイヤーのスコアを取得するには、次の2つの引数を取る関数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. テーブルからプレイヤーを削除する

ハイスコアテーブルからプレイヤーを削除するには、次の2つの引数を取る関数remove-playerを定義します。

  • ハイスコアテーブル
  • キーワードで表したプレイヤーの名前

この関数は、プレイヤーがまだテーブルに追加されていない場合も問題なく処理する必要があります。 当然ながら、プレイヤーを削除したあとにテーブルからそのスコアを取得すると、0になります。

(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に登録すれば、27個のコンセプト92個の演習、そして本物の人間によるメンタリングとともに、Common Lispを学んでマスターできます。すべて無料です。