Бінарне бінарне розширення


9

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

Пов'язані, але зовсім інші.
Джузеппе

4
Простий алгоритм: Перетворіть на базу 2, замініть 0 на -1, поставте LSD на фронт.
Джосія Уінслоу

Voile: Я не пояснював голосування, я просто окреслював алгоритм для людей, які мають команди базової конверсії мовою.
Джосія Уінслоу

Оскільки ви настільки зацікавлені в тому, щоб бути по-справжньому бінарним, чи можемо ми повернути це значення як упаковані біти зі звичайною цінністю місця, але новою інтерпретацією двох станів? тобто електрично це просто висока або низька напруга (або що завгодно), і я не винен, якщо стандартні налагоджувачі друкують 0замість стану -1низької напруги. Абонент, що отримує біти, знає, що вони означають. (Це все ще нетривіальна бітова маніпуляція, оскільки право обертання працює лише в тому випадку, якщо у нього є 32 значущі біти. Наприклад, для 5-бітного числа потрібна ширина обертання 5.)
Пітер Кордес,

Чи потрібно на виході включати роздільники? Чи 111-1-1дійсний вихід 25?
Олівер

Відповіді:



3

Pyth ,  12  11 байт

|R_1.>jQ2 1

Спробуйте тут!


Як?

| R_1.> JQ2 1 Повна програма.

      jQ2 Перетворити вхід у бінарний список.
     .> 1 Циклічно поверніть список вище на 1 місце праворуч.
| R_1 Замініть 0 на -1.
               Неналежне виведення.

По-перше, ми помічаємо, що завдання полягає в тому, щоб "просто замінити 0s у двійковому записі на -1s і перемістити вправо на 1 місце". - Це саме те, що ми повинні робити! Бінарне перетворення дає нам список 0s і 1s. Все , що ми повинні зробити тут , щоб знайти golfy спосіб перетворити 0в -1. Побітовий оператор |(побітовий АБО) - наш друг. Карта над бінарним поданням зміщується на |та -1. Якщо поточне число є 0, воно перетворюється в -1.


Я не думаю, що є кращого способу. ;)
Йосія Уінслоу

@JosiahWinslow Я роблю ... Спроба знайти
Містер Xcoder

Гм? Алгоритм здається оптимальним, можливо, це тому, що я не знаю Pyth.
Джосія Уінслоу

@JosiahWinslow Знайшов кращий спосіб. Синтаксичний кращий спосіб, а не алгоритмічний кращий спосіб.
Містер Xcoder

@ Mr.Xcoder А тепер насправді не існує, принаймні, для мене.
Erik the Outgolfer



2

Перл 6 , 72 байти

Звичайно, є кращий спосіб, але це те, що я маю ...

->$a {grep {$a==[+] @^a.reverse Z+< ^∞},[X] (1,-1)xx $a.base(2).chars}

Спробуйте в Інтернеті!

Пояснення : Це функція, яка бере один аргумент ( ->$a). Ми спочатку отримуємо кількість необхідних коефіцієнтів ( $a.base(2).chars= кількість символів у представленні бази 2), потім робимо декартовий добуток ( X) з цих багатьох пар (1,-1). ( [X]Засоби: зменшіть наступний список за допомогою X.) Отже, ми отримаємо список усіх можливих комбінацій 1s та -1s. Тоді ми фільтруємо ( grep) лише списки, які кодують задане число$a . Є лише один, тому ми отримуємо список одного списку з коефіцієнтами.

Блок grep робить це так: приймає його аргумент як list ( @^a), перевертає його і додає до нескінченного списку, 0,1,2,...використовуючи оператор "зсув лівого біта" +<. Зіпсування припиняється, як тільки коротший список вичерпується (добре для нас!) Потім ми підсумовуємо всі результати та порівнюємо їх із заданим числом. Нам довелося використовувати, .reverseтому що ОП вимагає, щоб коефіцієнти були в порядку від найбільш значущих до найменш значущих.




1

J, 11 байт

1-~2*_1|.#:

Спробуйте в Інтернеті!

Завдяки @JosiahWinslow за алгоритм.

Будь-які думки щодо скорочення конверсії? Мої думки - до використання!. -fit (nvm, це просто змінює толерантність перетворення).

Використання {-take довше на 1 символ.

_1 1{~_1|.#:

1

Java 8, 101 байт

n->{String s=n.toString(n,2);return(s.charAt(s.length()-1)+s.replaceAll(".$","")).replace("0","-1");}

Порт відповіді Japt @Oliver , ще з кількома байтами ..;)

Однозначно можна пограти в гольф, використовуючи математичний підхід замість цього струнного підходу.

Пояснення:

Спробуйте тут.

n->{                             // Method with Integer parameter and String return-type
  String s=n.toString(n,2);      //  Convert the Integer to a binary String
  return(s.charAt(s.length()-1)  //  Get the last character of the binary String
    +s.replaceAll(".$","")       //   + everything except the last character
   ).replace("0","-1");          //  Then replace all zeroes with -1, and return the result
}                                // End of method

1

R , 90 88 46 байт

function(n)c((n%/%2^(0:log2(n))%%2)[-1],1)*2-1

Спробуйте в Інтернеті!

Реалізує алгоритм Олівера , але повертає цифри у зворотному порядку. Оскільки ми гарантуємо, що nце ніколи не є рівним, найменше значущий біт (перший) - це завжди 1, тому ми видаляємо його і додаємо a 1до кінця, щоб імітувати обертання в Р. Завдяки Shaggy за те, що я змусив мене виправити математику .

Просте розміщення rev( )викликів функції у нижньому колонтитулі має повертати значення в тому ж порядку.

оригінальна відповідь, 88 байт:

function(n,b=2^(0:log2(n)))(m=t(t(expand.grid(rep(list(c(-1,1)),sum(b|1))))))[m%*%b==n,]

Анонімна функція; повертає значення у зворотному порядку із доданими іменами стовпців.

Спробуйте в Інтернеті!

Пояснення:

function(n){
 b <- 2^(0:log2(n))         # powers of 2 less than n
 m <- expand.grid(rep(list(c(-1,1)),sum(b|1))) # all combinations of -1,1 at each position in b, as data frame
 m <- t(t(m))               # convert to matrix
 idx <- m%*%b==n            # rows where the matrix product is `n`
 m[idx,]                    # return those rows
}

Я б не вважав, що результат є дійсним; запропонуйте запитати автора виклику для підтвердження.
Кудлатий

@Shaggy зворотне замовлення прямо дозволено: from the most significant digit to the least significant digit (or in reversed order).отже, це має бути цілком прийнятним.
Джузеппе

1
Зворотний порядок , а не зворотні знаки. Означаючи, що допустимим висновком для 25, наприклад, буде [1,1,1,-1,-1]або [-1,-1,1,1,1].
Shaggy

1
@Shaggy ах, ти маєш рацію, я просто зробив математику неправильно! має бути 2*bits - 1замість 1-2*bits. Дякую.
Джузеппе




0

Гольфскрипт, 14 13 14 байт

-1 байт, бо я забув, що %існував. +1 байт, тому що я також забув, вхід - це рядок.

~2base{.+(}%)\

1
Якщо ви збираєтесь припустити, що вхід надходить як ціле число, вам слід обернути код, {}щоб зробити його блоком. Повні програми можуть отримувати дані лише у вигляді рядків.
Пітер Тейлор

Гм ... що? Я мав на увазі, число висувається як ціле число, а не рядок, що містить число.
Джосія Уінслоу

У такому випадку ваша відповідь не є повноцінною програмою, і тому повинна бути "функцією" , або у випадку GolfScript - блоком. Тому це {2base{.+(}%\}на 15 байт. Аналогічно і ваша відповідь CJam.
Пітер Тейлор

Це повна програма. Введення в Golfscript неявно висувається на стек на початку програми, а введення в CJam задається перед виконанням та доступ до нього за допомогою команди q.
Джосія Уінслоу

У мене є знайомство з GolfScript . ( І CJam ). Якщо ви хочете стверджувати, що це повноцінна програма, вам потрібно встановити її ~.
Пітер Тейлор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.