Преобразовать из двоичного в неабинарный

15

Учитывая двоичное целое число включительно между 0и 1111111111111111(то есть 16-разрядное целое число без знака) в качестве входных данных, выведите то же самое целое число в неабинарном виде .

Ввод может быть в любом формате, наиболее удобном для вашего языка; например, если программе легче обрабатывать ввод с 16 цифрами, например 0000000000000101, а не просто 101, вы можете написать программу, чтобы принимать ввод только таким способом.

Образец ввода / вывода

> 1
1
> 10
110
> 1010
11110
> 110111001111000
11011001110001000
> 1001001
1011001

Вот пример программы, которую я написал, которая выполняет базовые преобразования, включая отрицательные и нецелые основания. Вы можете использовать его, чтобы проверить свою работу.

Питер Олсон
источник
Просто чтобы уточнить немного, вход и выход должны быть двоичными, верно? Я имею в виду: строки символов 0s и 1s. Мне кажется ясным, но ответ заставляет меня слегка усомниться ...
Джоанис
@ M.Joanis Входные данные являются двоичными, выходные данные являются небинарными (которые выглядят точно так же, как двоичные - строка с нулями и единицами - но способ интерпретации числа отличается.)
Питер Олсон
2
Похоже, что ссылка не работает, что является главной причиной того, почему мы требуем, чтобы вопросы были автономными в эти дни
Джо Кинг,

Ответы:

6

APL, 21 символ

'01'[-(16/¯2)⊤-2⊥⍎¨⍞]

Для этого я использовал Dyalog APL, ⎕IOустановив в 0, что позволяет нам индексировать массивы, начиная с 0, а не с 1.

Пояснение справа налево:

  • дает нам ввод пользователя как символьный вектор.
  • ⍎¨применяет функцию execute ( ) к каждому (¨ ) из вышеупомянутых символов, в результате чего получается вектор целых чисел 1 и 0.
  • 2⊥ декодирует вектор из базы 2 в десятичную.
  • - отменяет полученное десятичное целое число.
  • (16/¯2)⊤кодирует десятичное целое число в основание ¯2(минус 2). ( 16/¯2копия ¯2,16 время, приводя к 16 цифрам в нашем неабинарном номере.)
  • - отменяет каждый элемент нашего вновь закодированного числа (до этого он состоит из -1 и 0), чтобы мы могли использовать его для индексации нашего вектора символов.
  • '01'[ ... ]индексирует массив символов ( '01'), используя 0 и 1 отрицательного негабинарного вектора. Это так, мы получаем более хороший вывод.

Пример:

      '01'[-(16/¯2)⊤-2⊥⍎¨⍞]
10111010001
0001101011010001
Диллон Кауэр
источник
4

Руби, 32 31 символов

m=43690
'%b'%(gets.to_i(2)+m^m)

Использует ярлык негабинального вычисления .

Стефано Дием Бенатти
источник
Вход не жестко закодирован. 0xAAAA не является входом, это маска, которая будет преобразовывать вход. 0xAAAA эквивалентно 1010101010101010, который используется в операции XOR для преобразования двоичного кода в негабинарный. Сам ввод происходит из getsключевого слова, которое выбирается из STDIN.
Стефано Дием Бенатти
изменил 0xAAAA на 43690 (это то же самое число в десятичной дроби), чтобы уменьшить количество символов на 1. Тем не менее, становится сложнее понять, что происходит wtf.
Стефано Дием Бенатти
Ах хорошо. Я не рубин хорошо, поэтому я не был уверен. Прости за это.
Rɪᴋᴇʀ
3

GolfScript, 34 29 27 символов

n*~]2base{.2%\(-2/.}do;]-1%

Простой прямой подход. Интересно, что самая короткая версия - это та, которая сначала конвертируется в число, а затем обратно в базу -2 (по крайней мере, самую короткую версию, которую я мог найти до сих пор). Но самое приятное в этом то, что он содержит почти 15% %.

Правка 1: для базы 2 мы можем сохранить одну операцию по модулю, а также объединить оба цикла.

Редактировать 2: я нашел еще более короткий код для преобразования двоичной строки в целое число.

Говард
источник
3

Haskell, 86 83 байта

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=digits 2$xor(unDigits 2 n+m)m

Вызовите с помощью c, а затем целочисленный массив для цифр, например

c [1,1]

PS: я новичок, я правильно представил это?

РЕДАКТИРОВАТЬ: Сохранено несколько байтов благодаря Laikoni, а также исправлены некоторые опечатки

EDIT2: в качестве альтернативы, c :: String -> String:

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=concatMap show.digits 2$xor(unDigits 2(map(read.(:[]))n)+m)m

Для 114 байтов (но вы называете это строкой: c "11")

Общее отображаемое имя
источник
Да вы сделали! Добро пожаловать на сайт! Надеюсь, вы остаетесь вокруг!
Rɪᴋᴇʀ
Добро пожаловать в PPCG! Вы можете убрать круглые скобки undigits 2 n, потому что приложение функции связывается сильнее, чем +m. Вы также можете сохранить несколько байт, связываясь mв щитке: c n|m<-0xAAAAAAAA= ....
Лайкони
2

Python (2.x), 77 символов

(не такой короткий, как другие решения из-за необходимости вручную переключать базу ...) Должен удовлетворять требованиям.

i=input();d=""
while i:i,r=i//-2,i%-2;i+=r<0;d+=`r+[0,2][r<0]`
print d[::-1]

Предложения по дальнейшим улучшениям приветствуются!

Подайте это с начальными значениями как это: 0b1001001

ChristopheD
источник
2

JavaScript, 68 байт

function(b){for(r='',n=parseInt(b,2);r=(n&1)+r,n>>=1;n=-n);return r}

Было бы 52 байта в ES6, но это позже проблемы:

b=>eval(`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`)
Нил
источник
2

Желе , 4 байта, вызов языковых постдат

Ḅb-2

Попробуйте онлайн!

Принимает ввод и производит вывод в виде списка цифр.

объяснение

Ḅb-2
Ḅ     Convert binary to integer
 b-2  Convert integer to base -2

Это в значительной степени просто прямой перевод спецификации.


источник
Разве это не конкуренция? Этот вызов из '11 ...
NoOneIsHere
Я пропустил это. Я поставлю заметку в шапке.
1

k, 17 байт неконкурентоспособны

Некоторые из используемых функций, вероятно, устарели.

1_|2!{_.5+x%-2}\2/

Ввод - это список из 1 и 0, а также вывод из списка из 1 и 0.

Примеры работы программы.

zgrep
источник
0

ES8, 54B

b=>eval`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`
user75200
источник
0

Japt , 4 байта

Ввод в виде двоичной строки, вывод в виде массива неабинарных цифр.

Íì2n

Попытайся

Или, принимая входные данные в виде двоичного массива:

ì2JÉ

Попытайся

мохнатый
источник