مسیرها
/
Gleam
Gleam
/
تمرین‌ها
/
Gotta Snatch 'Em All
Gotta Snatch 'Em All

Gotta Snatch 'Em All

تمرین یادگیری

مقدمه

مجموعه

«مجموعه» یک ساختار داده‌ی تغییرناپذیر و بدون ترتیب است که فقط مقادیر یکتا را در خود نگه می‌دارد. همه‌ی عنصرهای یک مجموعه باید از یک نوع باشند.

ماژول 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™️ شما بپیوندند و بهترین راه این است که با دادن یک کارت، مجموعه‌شان را راه بیندازید.

تابع new_collection را پیاده‌سازی کنید که یک کارت را به یک مجموعه تبدیل می‌کند.

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

2. مجموعه را بزرگ کنید

وقتی مجموعه‌ای داشته باشید، گویی خودش جان می‌گیرد و باید رشد کند.

تابع add_card را پیاده‌سازی کنید که یک کارت و یک مجموعه می‌گیرد و یک تاپل با دو مقدار برمی‌گرداند: یک Bool که نشان می‌دهد آیا کارت از قبل در مجموعه بوده است یا نه، و مجموعه‌ای که کارت به آن اضافه شده است.

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

3. معامله را شروع کنید

حالا که دوستانتان دوباره دیوانه‌ی Blorkemon™️ شده‌اند، می‌توانید از این راه مجموعه‌ی خودتان را با معامله‌ی کارت‌ها بزرگ کنید.

هر معامله‌ای ارزش انجام دادن ندارد، یا اصلاً نمی‌توان آن را انجام داد. نمی‌توانید کارتی را که ندارید معامله کنید و نباید کارتی را با کارتی که از قبل دارید معامله کنید.

تابع trade_card را پیاده‌سازی کنید که دو کارت برای معامله (مال شما و مال آن‌ها) و مجموعه‌ی فعلی‌تان را می‌گیرد. مقدار برگشتی یک تاپل با دو مقدار است: یک 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

آماده‌اید Gotta Snatch 'Em All را شروع کنید؟

در Exercism ثبت‌نام کنید تا Gleam را همراه با 33 مفهوم122 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.