В Elixir, щоб вибрати випадковий елемент зі структури даних, яку можна перебирати (наприклад, масиву чи діапазону), ми використовуємо Enum.random. Ця функція вибирає один елемент, причому кожен елемент має однакову ймовірність бути вибраним.
Elixir не має власних функцій для вибору випадкового числа з плаваючою комою. Щоб це зробити, доводиться звертатися безпосередньо до 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. Мері грає капітана Пікара, тож їй доводиться вести капітанський журнал. Їй подобається творча частина гри, але не подобається придумувати випадкові дані на ходу.
Допоможіть Мері: створіть генератори випадкових даних для того, що часто трапляється в капітанському журналі.
Starship Enterprise під час своїх подорожей зустрічає багато планет. Планети у всесвіті Star Trek поділяються на категорії за своїми властивостями. Наприклад, Земля належить до планет класу M. Усі можливі класи планет: D, H, J, K, L, M, N, R, T і Y.
Реалізуйте функцію random_planet_class/0. Вона має повертати один із класів планет випадковим чином.
CaptainsLog.random_planet_class()
# => "K"
У космосі літає не лише Enterprise (реєстраційний номер NCC-1701)! Коли він зустрічає інший зореліт, Мері треба занотувати реєстраційний номер цього зорельота.
Реєстраційні номери починаються з префікса «NCC-», після якого йде число від 1000 до 9999 (включно).
Реалізуйте функцію random_ship_registry_number/0, яка повертає випадковий реєстраційний номер зорельота.
CaptainsLog.random_ship_registry_number()
# => "NCC-1947"
Який сенс у журналі, якщо в ньому немає дат?
Зоряна дата - це число з плаваючою комою. Пригоди 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
У капітанському журналі зоряні дати зазвичай округлюють до одного знака після коми.
Реалізуйте функцію format_stardate/1, яка приймає число з плаваючою комою і повертає рядок тексту (англ. string) із цим числом, округленим до одного знака після коми.
У реалізації слід використати функцію Erlang.
CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.