Зараз 2525 рік, і ми щойно вирушили в подорож, щоб відвідати всі планети Сонячної системи (Меркурій, Венеру, Землю, Марс, Юпітер, Сатурн, Уран і Нептун). Перша зупинка - Меркурій, де митні правила вимагають заповнити форму (бюрократія, вочевидь, не є особливістю самої лише Землі). Коли ми передаємо форму митнику, він уважно її вивчає і хмуриться. Невже ми справді сподіваємося, що він повірить, ніби нам лише 50 років? Нам, мабуть, ближче до 200!
Розвеселені, ми чекаємо, що митник ось-ось засміється, але він, схоже, цілком серйозний. Ми розуміємо, що вписали свій вік у земних роках, а митник чекав на нього в меркуріанських роках! Оскільки орбітальний період Меркурія навколо Сонця значно коротший за земний, у меркуріанських роках ми насправді значно старші. Після кількох швидких обчислень ми можемо назвати свій вік у меркуріанських роках. Митник задоволено всміхається і пропускає нас. Подумки ми занотовуємо собі розрахувати свій вік для конкретної планети перед майбутніми митними перевірками, щоб уникати таких плутанин.
Якщо нам цікаво, чому Плутон не потрапив до списку, подивімося це відео на YouTube.
Маючи вік у секундах, обчислімо, скільки років комусь було б на одній із планет нашої Сонячної системи.
Один земний рік дорівнює 365.25 земних діб, або 31,557,600 секунд. Якби нам сказали, що комусь 1,000,000,000 секунд, його вік становив би 31.69 земних років.
Для інших планет треба врахувати їхній орбітальний період у земних роках:
| Планета | Орбітальний період у земних роках |
|---|---|
| Меркурій | 0.2408467 |
| Венера | 0.61519726 |
| Земля | 1.0 |
| Марс | 1.8808158 |
| Юпітер | 11.862615 |
| Сатурн | 29.447498 |
| Уран | 84.016846 |
| Нептун | 164.79132 |
Насправді один повний оберт Землі навколо Сонця триває ближче до 365.256 діб (1 сидеричний рік). У григоріанському календарі в середньому 365.2425 діб. Хоча це не цілком точно, у цій вправі використовується значення 365.25. Про інші способи вимірювання року можна дізнатися зі статті Рік у Вікіпедії.
У Cairo, де немає вбудованої підтримки чисел з плаваючою комою, дробові значення ми подаємо як цілі числа.
Такий підхід необхідний у розробці блокчейнів, щоб зберігати точність обчислень.
У цій вправі ми використовуємо арифметику з фіксованою комою, перетворюючи орбітальні періоди в мікросекунди.
Наприклад, орбітальний період Меркурія, що становить 0.2408467 земних років, перетворюється на 240,846,700 мікросекунд після множення на 1,000,000.
Щоб урахувати десяткову точність, тестові випадки припускають, що отриманий вік має два десяткові знаки, представлені цілими числами.
Це означає, що вік 31.69 років зберігається як 3169 у коді.
Щоб досягти цього, ми множимо на 100 перед виконанням ділення.
Ось приклад:
let mercury_orbital_period = 240_846_700; // in microseconds
let age_microseconds = age_seconds * 1_000_000;
// multiplying with 100 to retain 2 decimal places
age_microseconds * 100 / mercury_orbital_period
Застосовуючи цей метод, ми гарантуємо, що дробові значення точно представлені цілими числами, зберігаючи потрібну точність до двох десяткових знаків, що критично важливо для проходження тестів.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Cairo, а також 25 концепцій68 вправ та справжнє наставництво від людей, і все це безкоштовно.