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.