Задний план
Большинство людей здесь должны быть знакомы с несколькими целочисленными базовыми системами: десятичной, двоичной, шестнадцатеричной, восьмеричной. Например, в шестнадцатеричной системе число 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