Перетворити з бінарного в негабінарне


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 цифр в нашому negabinary числа.)
  • - заперечує кожен елемент нашого щойно закодованого числа (до цього він складається з -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 еквівалентний 101010101010101010, який використовується в операції 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

Хаскелл, 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: Я новачок, чи правильно я це подав?

EDIT: Збережено кілька байтів завдяки 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


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

Це майже просто прямий переклад специфікації.


Хіба це не змагається? Цей виклик
починається

Я пропустив це. Я поміщу в шапку замітку.

1

k, 17 байт неконкурентоспроможні

Деякі використовувані функції, ймовірно, відкладають завдання.

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

Введення - це список 1-х та 0-х, а вихідний також список 1-х та 0-х.

Приклади роботи програми.





Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.