Фон
Більшість людей тут мають ознайомитись з кількома цілими базовими системами: десятковою, двійковою, шістнадцятковою, восьмеричною. Наприклад, у шістнадцятковій системі число abc.de 16 буде представляти
a*16^2 + b*16^1 + c*16^0 + d*16^-1 + e*16^-2
Однак можна також використовувати не цілі бази, як ірраціональні числа. Після того, як така база використовує золотий перетин ф = (1 + √5) / 2 ≈ 1.618 ... . Вони визначаються аналогічно цілим основам. Отже, число abc.de φ (де a до e - цілі цифри) буде представляти собою
a*φ^2 + b*φ^1 + c*φ^0 + d*φ^-1 + e*φ^-2
Зауважте, що в принципі будь-яка цифра може бути негативною (хоча ми до цього не звикли) - ми будемо представляти негативну цифру з провідною ~
. Для цього питання ми обмежимось цифрами від ~9
до 9
, тому ми можемо однозначно записати число як один рядок (з тильдами між ними). Так
-2*φ^2 + 9*φ^1 + 0*φ^0 + -4*φ^-1 + 3*φ^-2
буде написано як ~290.~43
. Таке число ми називаємо фінальним числом .
Фінальне число завжди може бути представлене в стандартній формі , це означає, що представлення використовує лише цифри 1
і 0
, не містять 11
ніде, і з необов'язковим знаком мінус, щоб вказати, що все число від’ємне. (Цікаво, що кожне ціле число має унікальне кінцеве подання у стандартній формі.)
Представлення, які не знаходяться у стандартній формі, завжди можна перетворити на стандартну форму, використовуючи наступні спостереження:
- 011 φ = 100 φ (тому що φ 2 = φ + 1)
- 0200 φ = 1001 φ (тому що φ 2 + 1 / φ = 2φ)
- 0 ~ 10 φ = ~ 101 φ (тому що φ - 1 / φ = 1)
В додаток:
- Якщо найзначнішою цифрою є
~1
(якщо решта числа є стандартною формою), число є негативним, і ми можемо перетворити його в стандартну форму, замінивши все1
і~1
, попередньо встановивши знак мінус, і знову застосувати вищевказані три правила, поки ми не отримати стандартну форму.
Ось приклад такої нормалізації (я використовую додаткові пробіли для позитивних цифр, щоб підтримувати вирівнювання кожної цифри):
1~3.2~1φ
1~3. 2~1φ Rule:
= 0~2. 3~1φ (3)
= ~1~1. 4~1φ (3)
= ~1 0 0. 4~1φ (3)
= ~1 0 0. 3 0 1φ (3)
= ~1 0 1. 1 0 2φ (2)
= ~1 1 0. 0 0 2φ (1)
= ~1 1 0. 0 1 0 0 1φ (2)
= - 1~1 0. 0~1 0 0~1φ (4)
= - 0 0 1. 0~1 0 0~1φ (3)
= - 0 0 1.~1 0 1 0~1φ (3)
= - 0 0 0. 0 1 1 0~1φ (3)
= - 0 0 0. 0 1 1~1 0 1φ (3)
= - 0 0 0. 0 1 0 0 1 1φ (3)
= - 0 0 0. 0 1 0 1 0 0φ (1)
Врожайність .-0.0101φ
Для подальшого читання у Вікіпедії є дуже інформативна стаття на цю тему.
Змагання
Отже, або інакше, напишіть програму або функцію, яка, даючи рядок, що представляє фінальне число (як описано вище), виводить його стандартну форму, не ведучими чи зворотними нулями. Вхід не обов'язково містить фінальну точку, але завжди міститиме цифру, що залишилася від неї (так, ні .123
). Вихід завжди повинен містити фінальну точку та принаймні одну цифру зліва від неї.
Ви можете взяти вхід через STDIN, ARGV або аргумент функції та повернути результат або роздрукувати його в STDOUT.
Ви можете використовувати інший алгоритм, ніж вищевказана процедура, якщо це в принципі правильний і точний для довільних (дійсних) входів - тобто єдиними межами, які потенційно можуть порушити вашу реалізацію, повинні бути технічні обмеження, такі як розмір вбудованої типи даних або наявна оперативна пам'ять. Наприклад, оцінювати вхід як число з плаваючою комою, а потім жадібно підбирати цифри не дозволяється, оскільки можна було знайти вхідні дані, для яких неточності з плаваючою комою призведе до неправильних результатів.
Це код гольфу, найкоротша відповідь (у байтах) виграє.
Випробування
Input Output
1 1.
9 10010.0101
1.618 10000.0000101
1~3.2~1 -0.0101
0.~1021 0. (or -0.)
105.~2 1010.0101
~31~5.~1 -100000.1001