Зазвичай ми розкладаємо число на двійкові цифри, присвоюючи їм потужність 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
?