Konwertuj z binarnego na negabinary


15

Biorąc pod uwagę binarną liczbę całkowitą włącznie 0i 1111111111111111(tj. 16-bitową liczbę całkowitą bez znaku) jako dane wejściowe, wypisz tę samą liczbę całkowitą w negabinary .

Dane wejściowe mogą być w dowolnym formacie najbardziej dogodnym dla twojego języka; na przykład, jeśli programowi łatwiej jest przetwarzać dane wejściowe za pomocą 16 cyfr, na przykład 0000000000000101, zamiast 101pisać, możesz napisać program, który akceptuje tylko dane wejściowe w ten sposób.

Próbki we / wy

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

Oto przykładowy program, który napisałem, który wykonuje konwersje bazowe, w tym zasady ujemne i niecałkowite. Możesz go użyć do sprawdzenia swojej pracy.


Żeby wyjaśnić to nieco bardziej, wejście i wyjście musiałyby być binarne, prawda? Mam na myśli: ciągi znaków 0s i 1s. Wydaje mi się jasne, ale odpowiedź sprawia, że ​​wątpię lekko ...
— Joanis

@ M.Joanis Wejście jest binarny, wyjście jest negabinary (która wygląda dokładnie tak samo jak binarny - ciąg zer i jedynek - ale sposób liczba jest interpretowana jest inaczej.)
— Peter Olson

2
Wydaje się, że link nie działa, co jest głównym powodem, dla którego wymagamy, aby pytania były obecnie samodzielne
— Jo King

Odpowiedzi:


6

APL, 21 znaków

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

Użyłem do tego Dyalog APL z ⎕IOustawioną na 0, co pozwala nam indeksować tablice zaczynając od 0 zamiast 1.

Objaśnienie, od prawej do lewej:

  • ⍞ daje nam wkład użytkownika jako wektor znaków.
  • ⍎¨stosuje funkcję wykonania ( ⍎) do każdego ( ¨) wyżej wymienionych znaków, w wyniku czego powstaje wektor liczb całkowitych 1 i 0.
  • 2⊥ dekoduje wektor z podstawy 2 na dziesiętną.
  • - neguje wynikową liczbę całkowitą dziesiętną.
  • (16/¯2)⊤koduje liczbę całkowitą dziesiętną w bazie ¯2(ujemna 2). ( 16/¯2powtarza się ¯2, 16razy, dając 16 cyfr w naszym numerze negabinarnym).
  • - neguje każdy element naszego nowo zakodowanego numeru (wcześniej składa się z -1 i 0), dzięki czemu możemy go użyć do indeksowania naszego wektora znaków.
  • '01'[ ... ]indeksuje tablicę znaków ( '01') za pomocą zer i jedynek negowanego wektora negabinarnego. Dzięki temu otrzymujemy ładniejszy wynik.

Przykład:

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

4

Ruby, 32 31 znaków

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

Używa skrótu do obliczania negabinary .


Wejście nie jest zakodowane na stałe. 0xAAAA nie jest wejściem, jest maską, która przekształci dane wejściowe. 0xAAAA jest równoważne 1010101010101010, który jest używany w operacji XOR do konwersji pliku binarnego na negabinarny. Samo wejście pochodzi ze getssłowa kluczowego, które jest pobierane ze STDIN.
— Stefano Diem Benatti

zmieniono 0xAAAA na 43690 (czyli taką samą liczbę dziesiętną), aby zmniejszyć liczbę znaków o 1. Utrudnia to jednak zrozumienie, że dzieje się wtf.
— Stefano Diem Benatti

Ah, dobrze. Nie dobrze rubinuje, więc nie byłam pewna. Przepraszam za to.
— Rɪᴋᴇʀ

3

GolfScript, 34 29 27 znaków

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

Proste podejście naprzód. Interesujące jest to, że najkrótsza wersja to ta, która najpierw konwertuje na liczbę, a następnie z powrotem na bazę -2 (przynajmniej najkrótszą wersję, jaką do tej pory mogłem znaleźć). Zaletą tego jest to, że zawiera prawie 15% %.

Edycja 1: Dla bazy 2 możemy zapisać jedną operację modulo, a także połączyć obie pętle.

Edycja 2: Znalazłem jeszcze krótszy kod do konwersji ciągu binarnego na liczbę całkowitą.


3

Haskell, 86 83 bajtów

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

Wywołaj używając c, a następnie tablicę liczb całkowitych dla cyfr, np

c [1,1]

PS: Jestem nowy, czy przesłałem to poprawnie?

EDYCJA: Zapisałem kilka bajtów dzięki Laikoni, a także poprawiłem kilka literówek

EDIT2: Alternatywnie, 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

Za 114 bajtów (ale wywołujesz go ciągiem znaków: c „11”)


Tak, zrobiłeś! Witamy na stronie! Mam nadzieję, że zostaniesz!
— Rɪᴋᴇʀ

Witamy w PPCG! Możesz upuścić nawiasy undigits 2 n, ponieważ aplikacja funkcji wiąże się silniej niż +m. Można również zapisać kilka bajtów przez wiązanie msię w gwardii: c n|m<-0xAAAAAAAA= ....
— Laikoni

2

Python (2.x), 77 znaków

(nie tak krótkie jak inne rozwiązania ze względu na konieczność ręcznego przełączania bazy ...) Powinien spełniać wymagania.

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

Sugestie dotyczące dalszych ulepszeń są mile widziane!

Wprowadź wartości początkowe takie jak to: 0b1001001


2

JavaScript, 68 bajtów

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

W ES6 byłoby 52 bajtów, ale po tym wyzwaniu:

b=>eval(`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`)

2

Galaretka , 4 bajty, wyzwanie dla postdate języka

Ḅb-2

Wypróbuj online!

Pobiera dane wejściowe i generuje dane wyjściowe jako listę cyfr.

Wyjaśnienie

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

Jest to właściwie tylko bezpośrednie tłumaczenie specyfikacji.


Czy to nie jest niekonkurencyjne? To wyzwanie pochodzi z '11 ...
— NoOneIsHere

Tęsknie za tym. Umieszczę notatkę w nagłówku.

1

k, 17 bajtów niekonkurujących

Niektóre z użytych funkcji prawdopodobnie zostały dodane po wyzwaniu.

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

Dane wejściowe to lista zer i jedynek, a dane wyjściowe to także lista zer i jedynek.

Przykłady działającego programu.





Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.