Треки
/
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™️, а найкращий спосіб - започаткувати їхню колекцію, подарувавши їм одну картку.

Реалізуйте 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

Час розпочати Хапай їх усіх!?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Gleam, а також 33 концепції122 вправи та справжнє наставництво від людей, і все це безкоштовно.