«مجموعه» یک ساختار دادهی تغییرناپذیر و بدون ترتیب است که فقط مقادیر یکتا را در خود نگه میدارد. همهی عنصرهای یک مجموعه باید از یک نوع باشند.
ماژول 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) نمایش داده میشود، چون وقتی هدف شما به دست آوردن همهی کارتهای موجود است، کارتهای تکراری اهمیتی ندارند.
شما واقعاً میخواهید دوستانتان هم به دیوانگی Blorkemon™️ شما بپیوندند و بهترین راه این است که با دادن یک کارت، مجموعهشان را راه بیندازید.
تابع new_collection را پیادهسازی کنید که یک کارت را به یک مجموعه تبدیل میکند.
new_collection("Newthree")
// -> set.from_list(["Newthree"])
وقتی مجموعهای داشته باشید، گویی خودش جان میگیرد و باید رشد کند.
تابع add_card را پیادهسازی کنید که یک کارت و یک مجموعه میگیرد و یک تاپل با دو مقدار برمیگرداند: یک Bool که نشان میدهد آیا کارت از قبل در مجموعه بوده است یا نه، و مجموعهای که کارت به آن اضافه شده است.
add_card(set.from_list(["Newthree"]), "Scientuna")
// -> #(False, set.from_list(["Newthree", "Scientuna"]))
حالا که دوستانتان دوباره دیوانهی Blorkemon™️ شدهاند، میتوانید از این راه مجموعهی خودتان را با معاملهی کارتها بزرگ کنید.
هر معاملهای ارزش انجام دادن ندارد، یا اصلاً نمیتوان آن را انجام داد. نمیتوانید کارتی را که ندارید معامله کنید و نباید کارتی را با کارتی که از قبل دارید معامله کنید.
تابع trade_card را پیادهسازی کنید که دو کارت برای معامله (مال شما و مال آنها) و مجموعهی فعلیتان را میگیرد.
مقدار برگشتی یک تاپل با دو مقدار است: یک Bool که مشخص میکند آیا معامله ممکن و ارزش انجام دادن دارد یا نه، و مجموعهای که اگر معامله را انجام میدادید به آن میرسیدید (حتی اگر در واقع ممکن نباشد).
trade_card("Scientuna", "Newthree", set.from_list(["Scientuna"]))
// -> #(True, set.from_list(["Newthree"]))
شما و دوستان علاقهمندتان به Blorkemon™️ دور هم جمع میشوید و از خودتان میپرسید کدام کارتها رایجتریناند.
تابع boring_cards را پیادهسازی کنید که فهرستی از مجموعهها میگیرد و فهرستی مرتبشده از کارتهایی را برمیگرداند که همهی مجموعهها دارند.
boring_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> ["Scientuna"]
آیا شما و دوستانتان روی هم همهی کارتهای Blorkemon™️ را دارید؟
تابع total_cards را پیادهسازی کنید که فهرستی از مجموعهها میگیرد و تعداد کل کارتهای متفاوت در همهی مجموعهها را برمیگرداند.
total_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> 2
برادرزادهتان بهزودی به دیدنتان میآید و دلتان میخواهد او را تحت تأثیر قرار دهید. بچهها براقی را دوست دارند، نه؟ کارتهای Blorkemon™️ هم میتوانند براق باشند!
تابع shiny_cards را پیادهسازی کنید که یک مجموعه میگیرد و مجموعهای برمیگرداند که همهی کارتهای با شروع "Shiny " را در خود دارد.
shiny_cards(set.from_list(["Newthree", "Scientuna", "Shiny Scientuna"]))
// -> set.from_list(["Shiny Scientuna"])