學習軌道
/
Gleam
Gleam
/
練習
/
高分排行榜
高分排行榜

高分排行榜

學習練習

簡介

型別別名

型別別名

在 Gleam 中,你可以用型別別名為現有的型別取一個方便的名稱,否則這些型別寫起來會很麻煩。

pub type Headers =
  List(#(String, String))

pub fn html_headers() -> Headers {
  [
    #("content-type", "text/html"),
    #("x-frame-options", "DENY"),
  ]
}

使用pub type撰寫時,這個別名可以在定義它的模組之外使用。如果省略pub,別名就是私有的,無法在其他模組中參照。

字典

Gleam 中的字典是用來以鍵值對儲存資料的資料結構。在其他語言中,這類結構也可能被稱為關聯式陣列、雜湊或字典。

字典的鍵和值可以是任何型別,而且字典不保證存取或回傳項目時的順序。

操作字典

字典是透過gleam/dict模組中的函式來建立和操作的。

// Create an empty dict
let dict1 = dict.new()

// Create a dict with some values
let dict2 = dict.from_list([
  #("name", "Gleam"),
  #("colour", "Pink"),
])

// Add a value to a dict
let dict3 = dict.insert(dict2, "website", "https://gleam.run")

// Get a value from a dict
let name = dict.get(dict3, "name")
// -> Ok("Gleam")

說明

在這個練習中,你要實作一種方式,用來記錄你當地街機廳裡最受歡迎遊戲的高分。

你要實作 5 個函式,大多和操作一個保存高分的物件有關。

1. 建立新的高分榜

建立一個函式create_score_board,它會回傳一個字典,用來當作高分榜。 這個物件的鍵會是玩家名稱,值則是他們的分數。 為了測試,你要直接在物件裡加入一筆資料。 這筆初始資料的玩家名稱應該是"The Best Ever",分數則是1_000_000。

create_score_board()
// returns an object with one initial entry

2. 將玩家加入高分榜

要把玩家加入高分榜,請定義函式add_player。 它接受 3 個參數:

  • 第一個參數是現有的高分榜字典。
  • 第二個參數是玩家名稱,型別為字串。
  • 第三個參數是分數,型別為整數。

這個函式會回傳加入新玩家和分數後的字典。

3. 從高分榜移除玩家

如果玩家違反街機廳的規則,就會被手動從高分榜上移除。 定義remove_player,它接受 2 個參數:

  • 第一個參數是現有的高分榜字典。
  • 第二個參數是玩家名稱,型別為字串。

這個函式應該回傳移除該玩家後的字典。

如果玩家原本就不在榜上,高分榜不應該有任何改變,直接原樣回傳即可。

4. 提高玩家分數

如果玩家在街機廳又完成了一局遊戲,就會有一定數量的分數加到榜上原本的分數。 實作update_score,它接受 3 個參數:

  • 第一個參數是現有的高分榜字典。
  • 第二個參數是要提高分數的玩家名稱。
  • 第三個參數是你想加到已儲存高分上的分數。

這個函式應該回傳更新分數後的字典。

如果玩家原本就不在榜上,高分榜不應該有任何改變,直接原樣回傳即可。

5. 套用週一獎勵分數

街機廳在週一會另外記一份高分榜。 當天結束時,榜上的每位玩家都會獲得 100 分的額外分數。

實作函式apply_monday_bonus,它接受一個高分榜。 這個函式會回傳為榜上每位玩家加上獎勵分數後的字典。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Gleam Exercism

準備好開始 高分排行榜 了嗎?

註冊 Exercism,透過 33 個概念122 個練習 和真人引導來學習並精通 Gleam,全部免費。