Множина - це незмінна й невпорядкована колекція унікальних значень. Усі елементи множини повинні мати однаковий тип.
Модуль 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"])
Зареєструйтеся на Exercism, щоб вивчати й опановувати Gleam, а також 33 концепції122 вправи та справжнє наставництво від людей, і все це безкоштовно.