Обычно мы разбиваем число на двоичные числа, присваивая ему степени 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
?Ответы:
Japt , 6 байт
Попробуйте онлайн!
Объяснение:
источник
Pyth ,
1211 байтовПопробуй это здесь!
Как?
Прежде всего, мы замечаем, что задача состоит в том, чтобы просто «заменить
0
s в двоичной записи на-1
s и сдвинуть вправо на 1 место». - Это именно то, что мы должны сделать! Двоичное преобразование дает нам список0
s и1
s. Все , что мы должны сделать здесь , чтобы найти golfy способ преобразовать0
в-1
. Побитовый оператор|
(побитовое ИЛИ) - наш друг. Карта над двоичным представлением сдвинута на|
и-1
. Если текущее число есть0
, оно конвертируется в-1
.источник
Perl 6
Строковая версия, 31 байт
Попробуйте онлайн!
Версия списка, 36 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
3534 байтаТестовый фрагмент
Показать фрагмент кода
источник
Perl 6 , 72 байта
Есть, конечно, лучший способ, но это то, что у меня есть ...
Попробуйте онлайн!
Объяснение : Это функция, которая принимает один аргумент (
->$a
). Сначала мы получаем необходимое количество коэффициентов ($a.base(2).chars
= количество символов в представлении базы 2), а затем делаем декартово произведение (X
) из этого числа пар(1,-1)
. ([X]
Значит: уменьшите следующий список с помощьюX
.) Таким образом, мы получаем список всех возможных комбинаций 1 и -1. Затем мы фильтруем (grep
) только те списки, которые кодируют данное число$a
. Существует только один, поэтому мы получаем список из одного списка с коэффициентами.Блок grep делает это: принимает свой аргумент как list (
@^a
), переворачивает его и упаковывает в бесконечный список,0,1,2,...
используя оператор «сдвиг влево»+<
. Застежка-молния прекращается, как только сокращается короткий список (это хорошо для нас!). Затем мы суммируем все результаты и сравниваем его с заданным числом. Нам пришлось использовать,.reverse
потому что ОП требует, чтобы коэффициенты были в порядке от наиболее значимого до наименее значимого.источник
Желе , 5 байт
Попробуйте онлайн!
источник
05AB1E ,
65 байтПопробуйте онлайн!
источник
D<
может быть®
(®
по умолчанию-1
).J 11 байт
Попробуйте онлайн!
Спасибо @JosiahWinslow за алгоритм.
Есть мысли о том, чтобы сделать конверсию короче? Мои мысли об использовании
!.
-fit (nvm, это просто меняет допуск конверсии).Использование
{
-take длиннее на 1 символ.источник
Java 8, 101 байт
Порт ответа @Oliver на Japt , с еще несколькими байтами ..;)
Определенно можно играть в гольф, используя математический подход вместо этого подхода String.
Объяснение:
Попробуй это здесь.
источник
R ,
908846 байтПопробуйте онлайн!
Реализует алгоритм Оливера , но возвращает цифры в обратном порядке. Поскольку нам гарантировано, что
n
это никогда не является четным, младший значащий бит (первый) всегда1
, поэтому мы удаляем его и добавляем1
конец до конца, чтобы имитировать вращение в R. Спасибо Шегги, за то, что он помог мне исправить математику .Простое размещение
rev( )
вызовов функций в нижнем колонтитуле должно возвращать значения в том же порядке.оригинальный ответ, 88 байт:
Анонимная функция; возвращает значения в обратном порядке с прикрепленными именами столбцов.
Попробуйте онлайн!
Объяснение:
источник
from the most significant digit to the least significant digit (or in reversed order).
следовательно, это должно быть совершенно приемлемо.25
, например, будет[1,1,1,-1,-1]
или[-1,-1,1,1,1]
.2*bits - 1
вместо1-2*bits
. Спасибо.Perl 5 , 30 байт
29-байтовый код, 1 байт для
-p
переключения.Попробуйте онлайн!
источник
CJam, 12 байт
Порт моего ответа на Golfscript.
источник
Рубин ,
44 37 3332 байтаПопробуйте онлайн!
источник
Golfscript,
141314 байтов-1 байт, потому что я забыл
%
существовать. +1 байт, потому что я также забыл, что ввод - это строка.источник
{}
чтобы сделать его блоком. Полные программы могут получать входные данные только в виде строк.{2base{.+(}%\}
для 15 байтов. Точно так же ваш ответ CJam.~
.