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

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

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

Вступ

Функції з кількома клаузами

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

Elixir пропонує кілька клауз функції та охоронні вирази, щоб писати:

def number(n) when n == 7 do
  "Awesome, that's my favorite"
end

def number(_n) do
  "That's not my favorite"
end

Під час виконання Elixir перевірятиме згори донизу вихідного файлу, яку клаузу функції викликати.

Змінні, які не використовуються, слід починати з підкреслення.

Охоронні вирази

Охоронні вирази використовують, щоб Elixir не викликав функції на основі оцінювання аргументів охоронними функціями. Охоронні вирази починаються з ключового слова when, за яким іде булевий вираз (англ. Boolean). Охоронні функції - це спеціальні функції, які:

  • Мають бути чистими і не змінювати жодних глобальних станів.
  • Мають повертати строго true або false.

Список поширених охоронних виразів можна знайти в документації Elixir. Він охоплює перевірки типів, базову арифметику, порівняння та строго булеві оператори.

Типові аргументи

Функції можуть оголошувати типові значення для одного або кількох аргументів. Розгляньмо цю функцію:

def number(n \\ 13), do: "That's not my favorite"

Під час компіляції Elixir створює визначення функції для number/0 (без аргументів) і number/1 (з одним аргументом).

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

Якщо функція має більше ніж одну клаузу, типові аргументи слід визначити в заголовку функції (функції без тіла) перед клаузами функції:

def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."

Вказівки

Ми створюємо просту онлайн-гру, у якій друг може вгадати секретне число. Хочеться дати трохи зворотного звʼязку, але не видати відповідь самою здогадкою. Нам потрібно розробити функцію, яка даватиме різні відповіді залежно від того, як здогадка співвідноситься із секретним числом.

Умова Відповідь
Коли здогадка збігається із секретним числом "Correct"
Коли здогадка на одиницю більша або на одиницю менша за секретне число "So close"
Коли здогадка більша за секретне число "Too high"
Коли здогадка менша за секретне число "Too low"
Коли здогадку не зроблено "Make a guess"

Усі здогадки та секретні числа є цілими числами.

1. Сформуйте відповідь, коли здогадка збігається із секретним числом

Реалізуйте функцію compare/2, яка приймає два аргументи, secret_number і guess, обидва з яких є цілими числами.

GuessingGame.compare(5, 5)
# => "Correct"

2. Сформуйте відповідь, коли здогадка більша за секретне число

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

GuessingGame.compare(5, 8)
# => "Too high"

3. Сформуйте відповідь, коли здогадка менша за секретне число

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

GuessingGame.compare(5, 2)
# => "Too low"

4. Сформуйте відповіді, коли здогадка на одиницю більша або на одиницю менша за секретне число

Змініть функцію compare, щоб вона відповідала на здогадки, близькі до секретного числа.

GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"

5. Сформуйте відповідь, коли здогадки немає

Змініть функцію compare, щоб вона відповідала на відсутність здогадки.

GuessingGame.compare(5)
# => "Make a guess"

GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elixir Exercism

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

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