Треки
/
Elm
Elm
/
Вправи
/
Злови їх усіх
Злови їх усіх

Злови їх усіх

Навчальна вправа

Вступ

Множина

Set a - це послідовність унікальних значень типу a. Значення мають бути типу comparable (Int, Float, Time, Char, String, а також кортежі або масиви порівнюваних типів).

Масиви та множини можна перетворювати одне в одного за допомогою Set.toList і Set.fromList. Через внутрішню структуру Set гарантовано, що масив, отриманий з Set.fromList, буде відсортовано.

Set.fromList [2, 3, 3, 3, 1, 1, 2]
    --> Set.fromList [1, 2, 3]

Set.toList (Set.fromList [2, 3, 3, 3, 1, 1, 2])
    --> [1, 2, 3]

Створювати та наповнювати множини можна за допомогою Set.empty, Set.singleton, Set.insert і Set.remove.

Set.empty
    --> Set.fromList []

Set.singleton "hi"
    --> Set.fromList ["hi"]

eightyEight = Set.singleton 88

Set.insert 88 eightyEight
    --> Set.fromList [88]

Set.insert 89 eightyEight
    --> Set.fromList [88, 89]

Set.remove 88 eightyEight
    --> Set.fromList []

Set.remove 89 eightyEight
    --> Set.fromList [88]

За допомогою функцій Set.member, Set.isEmpty і Set.size можна дізнаватися про вміст множини.

Set.member 88 eightyEight
    --> True

Set.isEmpty eightyEight
    --> False

Set.size eightyEight
    --> 1

Множини можна обʼєднувати за допомогою Set.union, Set.intersect і Set.diff.

a = Set.fromList [1, 10, 100]
b = Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Set.union a b
    --> Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]

Set.intersect a b
    --> Set.fromList [1, 10]

Set.diff a b
    --> Set.fromList [100]

Set.diff b a
    --> Set.fromList [2, 3, 4, 5, 6, 7, 8, 9]

Множини можна фільтрувати та розподіляти.

even n = modBy 2 n == 0

Set.filter even b
    --> Set.fromList [2, 4, 6, 8, 10]

Set.partition even b
    --> (Set.fromList [2, 4, 6, 8, 10], Set.fromList [1, 3, 5, 7, 9])

Вказівки

Наша ностальгія за картками Blorkemon™️ і не думає вщухати: ми навіть знову почали їх збирати й залучаємо до цього друзів.

У цій вправі колекція Card представлена типом Set Card, адже коли наша мета - зібрати всі наявні картки, дублікати не мають значення.

1. Почніть колекцію

Нам дуже хочеться, щоб друзі долучилися до нашого божевілля з Blorkemon™️, і найкращий спосіб - запустити їхню колекцію, подарувавши їм одну картку.

Реалізуйте newCollection, яка перетворює картку на колекцію.

newCollection "Newthree"
    --> Set.fromList ["Newthree"]

2. Примножте колекцію

Коли колекція вже є, вона починає жити власним життям і мусить рости.

Реалізуйте addCard, яка приймає Card і колекцію та повертає Tuple з двома значеннями: Bool, що вказує, чи картка вже була в колекції, і колекцію з доданою карткою.

addCard "Scientuna" (Set.fromList ["Newthree"])
    --> (False, Set.fromList ["Newthree", "Scientuna"])

3. Почніть обмін

Тепер, коли наші друзі знову божеволіють від Blorkemon™️, ми можемо скористатися цим, щоб примножити власну колекцію, обмінюючись картками.

Не кожен обмін варто робити, а деякі взагалі неможливі. Не можна обміняти картку, якої в нас немає, і не варто віддавати картку за ту, яка в нас уже є.

Реалізуйте tradeCard, яка приймає дві картки для обміну (нашу й чужу) і нашу поточну колекцію. Повернене значення - це Tuple з двох значень: Bool, який указує, чи обмін можливий і чи вартий він того, і колекція, яка була б у нас у результаті обміну (навіть якщо насправді він неможливий).

tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
    --> (True, Set.fromList ["Newthree"])

4. Кожної картки може бути лише одна

Ми знаходимо старий запас карток на блошиному ринку. Потрібно відсортувати картки й прибрати дублікати, щоб порівняти список зі своєю колекцією.

Реалізуйте removeDuplicates, яка сортує список карток і повертає список відсортованих унікальних карток.

removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
    --> ["Newthree", "Scientuna"]

5. Картки, яких у них немає

Час пишатися своєю колекцією.

Реалізуйте extraCards, яка приймає нашу колекцію та якусь іншу колекцію і повертає кількість карток, яких немає в іншій колекції.

extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
    --> 0

6. Картки, які є в усіх

Ми збираємося з друзями-ентузіастами Blorkemon™️ і міркуємо, які картки найпоширеніші.

Реалізуйте boringCards, яка приймає список колекцій і повертає список відсортованих карток, які є в усіх колекціях.

boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
    --> ["Scientuna"]

7. Усі картки

Чи володіємо ми з друзями разом усіма картками Blorkemon™️?

Реалізуйте totalCards, яка приймає список колекцій і повертає загальну кількість різних карток у всіх колекціях.

totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
    --> 2

8. Блискучі картки для перемоги

Скоро до нас у гості приїде наш племінник, і хочеться його вразити. Діти ж люблять усе блискуче, правда? А картки Blorkemon™️ бувають блискучими!

Реалізуйте splitShinyCards, яка приймає колекцію та повертає Tuple з двома списками відсортованих карток: один з усіма картками, що починаються на "Shiny", і один з рештою карток.

splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
    --> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elm Exercism

Час розпочати Злови їх усіх?

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