Обычно мы разбиваем число на двоичные числа, присваивая ему степени 2 с коэффициентом
0
или1
для каждого члена:
25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1
Выбор
0
и1
есть ... не очень бинарный. Мы выполним истинное двоичное расширение, расширяясь степенями 2, но с коэффициентом1
или-1
вместо:
25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1
Теперь это выглядит бинарным.
Учитывая любое положительное число, должно быть тривиально видеть, что:
- Каждое нечетное число имеет бесконечно много истинных двоичных разложений
- Каждое четное число не имеет истинных двоичных разложений
Следовательно, для того, чтобы истинное двоичное разложение было правильно определено, мы требуем, чтобы разложение было наименьшим , то есть с самой короткой длиной.
При наличии любого положительного, нечетного целого числа n
верните его истинное двоичное расширение от старшей к младшей (или в обратном порядке).
Правила:
- Как это Код-гольф, вы должны стремиться сделать это как можно быстрее. Встроенные разрешены.
- Любые выходные данные, которые могут представлять и перечислять коэффициенты, являются приемлемыми: массив, строка коэффициентов с разделителями и т.д ...
- Применяются стандартные лазейки для игры в гольф.
- Ваша программа должна работать для значений в пределах стандартного целочисленного размера вашего языка.
Тестовые случаи
25 -> [1,1,1,-1,-1]
47 -> [1,1,-1,1,1,1]
1 -> [1]
3 -> [1,1]
1234567 -> [1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1]
0
вместо состояния -1
низкого напряжения. Получатель битов знает, что они имеют в виду. (Это все еще нетривиальное упражнение по манипуляции с битами, поскольку право поворота работает только в том случае, если оно имеет 32 значащих бита. Например, для 5-битного числа требуется ширина поворота 5).
111-1-1
действительным выходом для 25
?