Треки
/
Elixir
Elixir
/
Вправи
/
Капітанський журнал
Капітанський журнал

Капітанський журнал

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

Вступ

Випадковість

В Elixir, щоб вибрати випадковий елемент зі структури даних, яку можна перебирати (наприклад, масиву чи діапазону), ми використовуємо Enum.random. Ця функція вибирає один елемент, причому кожен елемент має однакову ймовірність бути вибраним.

Elixir не має власних функцій для вибору випадкового числа з плаваючою комою. Щоб це зробити, доводиться звертатися безпосередньо до Erlang.

Бібліотеки Erlang

Код Elixir виконується на віртуальній машині BEAM. BEAM є частиною системи виконання Erlang. Натхненний Erlang і поділяючи з ним середовище виконання, Elixir забезпечує чудову взаємодію з бібліотеками Erlang. Це означає, що розробники Elixir можуть використовувати бібліотеки Erlang у своєму коді на Elixir. Насправді, писати бібліотеки Elixir для функціональності, яку вже надають бібліотеки Erlang, у спільноті Elixir не заохочують.

Як наслідок, певна функціональність, як-от математичні операції чи функції таймера, доступна в Elixir лише через Erlang.

Стандартна бібліотека Erlang доступна для використання в нашому коді Elixir без жодних додаткових кроків.

Функції Erlang можна викликати так само, як ми викликаємо функції Elixir, з однією невеликою відмінністю. Назви модулів Erlang записують як атоми в snake_case. Наприклад, щоб викликати функцію Erlang pi/0 з модуля math, треба написати:

:math.pi()
# => 3.141592653589793

Найпоширеніші функції Erlang, які не мають відповідника в Elixir:

  • :timer.sleep/1 призупиняє процес на задану кількість мілісекунд.
  • :rand.uniform/0 генерує випадкове число з плаваючою комою x, де 0.0 <= x < 1.0.
  • :io_lib.format/2 забезпечує форматування рядків тексту (англ. string) у стилі C (за допомогою керівних послідовностей). За допомогою цієї функції ми могли б, наприклад, надрукувати ціле число в будь-якій системі числення від 2 до 36 або відформатувати число з плаваючою комою з потрібною точністю. Зауважмо, що ця функція, як і багато функцій Erlang, повертає charlist.
  • Модуль math, який надає математичні функції, як-от sin/1, cos/1, log2/1, log10/1, pow/2 та інші.

Щоб пізнати стандартну бібліотеку Erlang, перегляньте Довідник STDLIB.

Вказівки

Мері дуже любить серіал Star Trek: The Next Generation. Вона часто грає в настільні рольові ігри, де разом із друзями вдає себе за екіпаж Starship Enterprise. Мері грає капітана Пікара, тож їй доводиться вести капітанський журнал. Їй подобається творча частина гри, але не подобається придумувати випадкові дані на ходу.

Допоможіть Мері: створіть генератори випадкових даних для того, що часто трапляється в капітанському журналі.

1. Згенерувати випадкову планету

Starship Enterprise під час своїх подорожей зустрічає багато планет. Планети у всесвіті Star Trek поділяються на категорії за своїми властивостями. Наприклад, Земля належить до планет класу M. Усі можливі класи планет: D, H, J, K, L, M, N, R, T і Y.

Реалізуйте функцію random_planet_class/0. Вона має повертати один із класів планет випадковим чином.

CaptainsLog.random_planet_class()
# => "K"

2. Згенерувати випадковий реєстраційний номер зорельота

У космосі літає не лише Enterprise (реєстраційний номер NCC-1701)! Коли він зустрічає інший зореліт, Мері треба занотувати реєстраційний номер цього зорельота.

Реєстраційні номери починаються з префікса «NCC-», після якого йде число від 1000 до 9999 (включно).

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

CaptainsLog.random_ship_registry_number()
# => "NCC-1947"

3. Згенерувати випадкову зоряну дату

Який сенс у журналі, якщо в ньому немає дат?

Зоряна дата - це число з плаваючою комою. Пригоди Starship Enterprise з першого сезону The Next Generation відбуваються між зоряними датами 41000.0 і 42000.0. «4» означає 24-те століття, а «1» - перший сезон.

Реалізуйте функцію random_stardate/0, яка повертає число з плаваючою комою від 41000.0 (включно) до 42000.0 (не включно).

У реалізації слід використати функцію Erlang.

CaptainsLog.random_stardate()
# => 41458.15721310934

4. Відформатувати зоряну дату

У капітанському журналі зоряні дати зазвичай округлюють до одного знака після коми.

Реалізуйте функцію format_stardate/1, яка приймає число з плаваючою комою і повертає рядок тексту (англ. string) із цим числом, округленим до одного знака після коми.

У реалізації слід використати функцію Erlang.

CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elixir Exercism

Час розпочати Капітанський журнал?

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