Треки
/
Gleam
Gleam
/
Вправи
/
Гра у вгадування
Гра у вгадування

Гра у вгадування

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

Вступ

Вирази case

У Gleam вираз case можна використати, щоб умовно виконати код. За допомогою виразу case значення можна перевірити на відповідність одному або кільком зразкам. Приклад такого зразка — літеральний зразок, який зіставляє значення з літеральним значенням (наприклад, 1 або "hello").

Вирази case записують за допомогою ключового слова case:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    1 -> "One"
  }
}

Хоча це може мати вигляд switch-інструкцій в інших мовах, зіставлення зі зразками розкриває свої переваги тоді, коли ми використовуємо й інші зразки. Один із таких зразків — зразок-змінна, який дозволяє присвоїти значення змінній. У цьому прикладі змінна i отримає значення number, якщо воно не дорівнює 0:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i -> "Non zero"
  }
}

У деяких випадках може знадобитися додати до зразка додаткову умову. Це називається сторожовою умовою (guard clause), яку можна додати за допомогою ключового слова if:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
  }
}

З міркувань продуктивності у сторожових умовах дозволені лише базові математичні та булеві оператори, а інші функції використовувати в них не можна.

У наведеному вище прикладі не для всіх можливих вхідних даних знайдеться відповідний зразок. Компілятор це виявить і видасть помилку. Це називається перевіркою вичерпності. Щоб позбутися цього попередження, потрібно обробити всі випадки. Для цього можна скористатися зразком-відкиданням, який збігається з будь-яким значенням:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}

// No compiler error

В одній гілці можна зіставити кілька зразків, розділяючи їх знаком |. До однієї гілки можна додати лише одну сторожову умову:

pub fn describe(number: Int) -> String {
  let yell = True
  case number {
    0 -> "Zero"
    3 | 5 -> "One of the first odd prime numbers"
    2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
    i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}
// No compiler error

Вирази case перевіряють значення на відповідність кожному зразку згори донизу, доки не знайдуть відповідний зразок і не виконають логіку, повʼязану з ним. Порядок зразків має значення!

Вказівки

У цій вправі ми граємо з другом у гру на вгадування чисел. Правила прості: ми потай загадуємо число від 1 до 100, а наш друг намагається вгадати, яке число ми загадали. Щоб допомогти другові, ми відповідаємо по-різному залежно від того, наскільки близьким було припущення до загаданого числа (42). Ось правила для різних відповідей:

  • Якщо припущення 42: «Correct»
  • Якщо припущення 41 або 43: «So close»
  • Якщо припущення менше за 41: «Too low»
  • Якщо припущення більше за 43: «Too high»

На нас чекають чотири завдання, у яких ми закодуємо відповіді на припущення.

1. Відповідь на правильне припущення

Реалізуйте функцію reply, щоб вона відповідала на правильне припущення:

reply(42)
// -> "Correct"

2. Відповідь на близьке припущення

Змініть функцію reply, щоб вона відповідала на близькі припущення:

reply(41)
// -> "So close"

3. Відповідь на занизьке припущення

Змініть функцію reply, щоб вона відповідала на занизькі припущення:

reply(25)
// -> "Too low"

4. Відповідь на зависоке припущення

Змініть функцію reply, щоб вона відповідала на зависокі припущення:

reply(88)
// -> "Too high"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Gleam Exercism

Час розпочати Гра у вгадування?

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