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.

Peter Olson
źródło
Ż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
Dillon Cower
źródło
4

Ruby, 32 31 znaków

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

Używa skrótu do obliczania negabinary .

Stefano Diem Benatti
źródło
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ą.

Howard
źródło
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”)

Ogólna nazwa wyświetlana
źródło
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

ChristopheD
źródło
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`)
Neil
źródło
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.


źródło
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.

zgrep
źródło
0

PHP, 69 bajtów

for($i=bindec($argn);$i;$i+=$i%2&$c,$i>>=1,$c^=1)$r=($i%2).$r;echo$r;

Wersja online

Jörg Hülsermann
źródło
0

ES8, 54B

b=>eval`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`
użytkownik75200
źródło
0

Japt , 4 bajty

Dane wejściowe jako ciąg binarny, dane wyjściowe jako ujemna tablica cyfr.

Íì2n

Spróbuj

Lub przyjmując dane wejściowe jako tablicę cyfr binarnych:

ì2JÉ

Spróbuj

Kudłaty
źródło