學習軌道
/
Gleam
Gleam
/
練習
/
全部抓起來
全部抓起來

全部抓起來

學習練習

簡介

集合

集合是不可變、無序的,其中的值都獨一無二。集合中的所有元素都必須是相同的型別。

gleam/set 模組定義了 Set 型別,並提供各種處理集合的函式。

你可以用 set.to_list 和 set.from_list 把陣列和集合互相轉換。集合中元素的順序並沒有保證。

set.from_list([2, 3, 3, 3, 1, 1, 2])
// -> set.from_list([1, 2, 3])

set.to_list(set.from_list([2, 3, 3, 3, 1, 1, 2]))
// -> [1, 2, 3]

你可以用 set.new、set.insert 和 set.delete 建立集合並填入元素。

set.new()
// -> set.from_list([])

let eighty_eight = set.from_list([88])

set.insert(eighty_eight, 88)
// -> set.from_list([88])

set.insert(eighty_eight, 89)
// -> set.from_list([88, 89])

set.delete(eighty_eight, 89)
// -> set.from_list([88])

你可以用 set.contains 和 set.size 這兩個函式查詢集合的內容。

set.contains(eighty_eight, 88)
// -> True

set.size(eighty_eight)
// -> 1

集合可以用 set.union 和 set.intersection 來結合。

let a = set.from_list([1, 5, 10])
let b = set.from_list([1, 2, 3, 4, 5])

set.union(a, b)
// -> set.from_list([1, 2, 3, 4, 5, 10])

set.intersection(a, b)
// -> set.from_list([1, 5])

你也可以篩選集合。

let is_small = fn(n) { n <= 3 }

set.filter(b, is_small)
// -> set.from_list([1, 2, 3])

說明

你對 Blorkemon™️ 卡片的懷舊之情絲毫沒有減退的跡象,甚至又開始收集起來,還拉著朋友一起加入。

在這個練習中,卡片收藏以Set(String)表示,因為當你的目標是蒐集所有現有的卡片時,重複的卡片並不重要。

1. 開始收藏

你真的很希望朋友們也加入你的 Blorkemon™️ 狂熱,而最好的方式就是送他們 1 張卡片,幫他們的收藏起個頭。

實作new_collection,把一張卡片轉換成一個收藏。

new_collection("Newthree")
// -> set.from_list(["Newthree"])

2. 擴充收藏

有了收藏之後,它便有了自己的生命,必須持續成長。

實作add_card,它接收一張卡片和一個收藏,並回傳一個帶有 2 個值的元組:一個Bool,表示這張卡片是否已經在收藏裡,以及加入該卡片後的收藏。

add_card(set.from_list(["Newthree"]), "Scientuna")
// -> #(False, set.from_list(["Newthree", "Scientuna"]))

3. 開始交易

既然朋友們又為 Blorkemon™️ 瘋狂了,你就可以藉由交易卡片來擴充自己的收藏。

不是每筆交易都值得做,有些甚至根本做不成。 你不能交易自己沒有的卡片,也不該拿一張卡片去換自己已經有的卡片。

實作trade_card,它接收 2 張要交易的卡片(你的和對方的)以及你目前的收藏。 回傳值是一個帶有 2 個值的元組:一個Bool,說明這筆交易是否可行又值得,以及假如你真的完成交易後會得到的收藏(即使實際上根本不可能)。

trade_card("Scientuna", "Newthree", set.from_list(["Scientuna"]))
// -> #(True, set.from_list(["Newthree"]))

4. 大家都有的卡片

你和熱愛 Blorkemon™️ 的朋友們聚在一起,想著哪些卡片最常見。

實作boring_cards,它接收一個收藏的陣列,回傳一個排序過的卡片陣列,這些卡片是所有收藏都有的。

boring_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> ["Scientuna"]

5. 所有的卡片

你和朋友們加起來,擁有全部的 Blorkemon™️ 卡片嗎?

實作total_cards,它接收一個收藏的陣列,回傳所有收藏中不同卡片的總數。

total_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> 2

6. 閃卡無敵

你的侄子快要來拜訪你了,你想讓他印象深刻。 小孩子都喜歡閃亮亮的東西,對吧? Blorkemon™️ 卡片也能有閃亮版本喔!

實作shiny_cards,它接收一個收藏,回傳一個集合,裡面包含所有以"Shiny "開頭的卡片。

shiny_cards(set.from_list(["Newthree", "Scientuna", "Shiny Scientuna"]))
// -> set.from_list(["Shiny Scientuna"])
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Gleam Exercism

準備好開始 全部抓起來 了嗎?

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