Треки
/
Elm
Elm
/
Вправи
/
Картки Блоркемонів
Картки Блоркемонів

Картки Блоркемонів

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

Вступ

Порівняння

Рівність

Типи Elm можна перевірити на «однаковість» за допомогою оператора рівності (==). Оператор нерівності має вигляд (/=) (не !=, як у багатьох мовах). Оператор рівності працює з літералами, кортежами, записами та власними типами.

1 == 2
    --> False

1 /= 2
    --> True

(1, 2) == (2, 1)
    --> False

type alias MyRecord = { myInt : Int, myStrings : List String }
a : MyRecord
a = MyRecord (1 + 1) ["hello world"]

type alias MyOtherRecord = { myInt : Int, myStrings : List String }
myStrings =  (String.join " " ["hello", "world"]) :: []
b : MyOtherRecord
b = { myInt = 2, myStrings = myStrings}

a == b
    --> True

Зауважмо, що функції ніколи не слід порівнювати, бо це призведе до аварійного завершення програми під час виконання.

Операції порівняння

Оператори порівняння (<), (<=), (>), (>=) і функції min, max, compare працюють із типами comparable. Тип comparable - це особливий тип, який обʼєднує всі вбудовані типи, які можна порівнювати: числа, символи, рядки тексту (англ. string), масиви порівнюваних значень і кортежі порівнюваних значень.

1 < 1 + 1
    --> True

'x' < 'X'
    --> False

"abc" < "abz"
    --> True

"abc" < "abcd"
    --> True

"abc" < "b"
    --> True

min [1 , 2, 9000] [10]
    --> [1 , 2, 9000]

min (1, "hello") (3, "bye")
    --> (1, "hello")

Значення інших типів, як-от записів чи власних типів, не можна порівнювати безпосередньо.

Деякі вбудовані типи вимагають, щоб їхній вміст був comparable, наприклад ключі Set чи Dict, оскільки їхня структура спирається на внутрішнє впорядкування.

Масиви comparable-значень можна сортувати за допомогою List.sort, а масиви значень, які можна перетворити на порівнювані значення, за допомогою List.sortBy. Якщо потрібне ієрархічне сортування (сортувати за однією властивістю, а однакові значення впорядковувати за іншою), кортежі чи масиви теж можна використовувати з List.sortBy, оскільки кортежі й масиви сортуються в лексикографічному порядку.

List.sort ["hi", "hello", "bye", "goodbye"]
    --> ["bye", "goodbye", "hello", "hi"]

List.sortBy String.length ["hi", "hello", "bye", "goodbye"]
    --> ["hi", "bye", "hello", "goodbye"]

-- sort by length, then alphabetically
List.sortBy (\str -> (String.length str, str)) ["hi", "mum", "hello", "sis", "bye", "dad"]
    --> ["hi", "bye", "dad", "mum", "sis", "hello"]

Функція compare приймає два comparable-значення і повертає Order. Order - це тип, який за одну операцію перевіряє, чи значення більше (GT), рівне (EQ) або менше (LT) за інше.

compare 1 2
    --> LT

compare "" ""
    --> EQ

compare [12] []
    --> GT

Функції порівняння можна побудувати для довільних типів і використовувати, наприклад, для сортування за допомогою List.sortWith:

type Color = Red | Green | Blue

compareColors : Color -> Color -> Order
compareColors a b =
  case (a, b) of
    (Red, Red) -> EQ
    (Red, _) -> LT
    (_, Red) -> GT
    (Green, Green) -> EQ
    (Green, _) -> LT
    (_, Green) -> GT
    (Blue, Blue) -> EQ

List.sortWith compareColors [Blue, Red, Green, Green, Blue]
    --> [Red, Green, Green, Blue, Blue]

Вказівки

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

1. Порівняйте рівні сили

Кожна картка Blorkemon™️ здається потужнішою за наступну, але краще перевірити.

Реалізуйте функцію isMorePowerful. Вона повинна повертати True, якщо картка з її першого аргументу строго потужніша за іншу, і False в іншому разі.

newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True

isMorePowerful newthree scientuna
    --> True

2. Знайдіть найвищу силу

Маючи на руках повний набір карток Blorkemon™️, ми зможемо підготувати найнищівнішу атаку.

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

maxPower newthree scientuna
    --> 120

3. Посортуйте картки

Здається, ми памʼятаємо, що в нас була принаймні одна картка кожного Blorkemon™️, але минув уже деякий час відтоді, як ми востаннє їх перевіряли, тож варто посортувати картки, щоб порівняти їх з офіційним списком на Pulpapedia.

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

sortByMonsterName [newthree, scientuna]
    --> [Card "Newthree" 120 False, Card "Scientuna" 6 True]

4. Спочатку найкрутіші картки

Blorkemon™️ - це найкрутіше, що взагалі буває. Ми не використовуємо це слово легковажно, у нас є науковий метод, щоб це довести.

Реалізуйте функцію sortByCoolness, яка сортує список карток, ставлячи найкрутіші з них першими. Крутість картки насамперед визначає її блискучість: усі блискучі картки значно крутіші за решту. Другим чинником є рівень сили: що вищий, то краще.

sortByCoolness [newthree, scientuna]
    --> [Card "Scientuna" 6 True, Card "Newthree" 120 False]

5. Блискуча сила

Блискучість потрібна не лише для краси: у битві Blorkemon™️ з однаковою силою блискучий завжди перемагає. Це називають блискучою силою.

Реалізуйте функцію compareShinyPower, яка формалізує цю властивість. Порядок (Order) двох карток визначають рівні сили, якщо вони різні; якщо ж вони однакові, блискуча картка буде більшою.

compareShinyPower newthree scientuna
    --> GT

6. Зробіть ставки

У грі в картки Blorkemon™️ можливо все, але потужніші картки все ж мають схильність перемагати.

Реалізуйте функцію expectedWinner, яка повертає імʼя монстра, що найімовірніше переможе, згідно з упорядкуванням compareShinyPower. Функція повинна повертати імʼя монстра-очікуваного переможця або "too close to call", якщо в обох суперників однакова блискуча сила.

expectedWinner newthree scientuna
    --> "Newthree"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elm Exercism

Час розпочати Картки Блоркемонів?

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