tło
Ciężar Hamminga liczby całkowitej jest liczba jedynek w jej reprezentacji binarnej. W przypadku tego wyzwania liczby całkowite są reprezentowane przez 32 bity i są niepodpisane.
Wyzwanie
Biorąc pod uwagę liczbę całkowitą od 0 do 2 ^ 32-1 (nie obejmuje), wypisz inną liczbę całkowitą w tym samym zakresie, a także o tej samej masie Hamminga.
Przykłady
Input (Decimal) | Input (Binary) | Hamming weight | Possible output (Decimal)
46 | 0b0010 1110 | 4 | 15
12 | 0b0000 1100 | 2 | 3
1 | 0b0000 0001 | 1 | 2
3 | 0b0000 0011 | 2 | 6
2^31 | 0b1000....0 | 1 | 1
2^31+2 | 0b1000...10 | 2 | 3
2^32-5 | 0b1111..011 | 31 | 2^31-1
2^32-2 | 0b1111....0 | 31 | 2^31-1
0 | 0b0000 0000 | 0 | None (This case need not be handled)
2^32-1 | 0b1111....1 | 32 | None (This case need not be handled)
Punktacja
To jest golf golfowy , więc wygrywa rozwiązanie z najmniejszą liczbą bajtów w każdym języku.
2^31+2
, powtórzę, że powiedziałem liczbę nieparzystą . Odpowiedzi, o których mowa, zawiodły tylko wtedy, gdy zarówno najwyższy, jak i najniższy bit są1
.Odpowiedzi:
Zestaw x86-64,
54 bajtówFunkcja korzystająca z konwencji wywoływania C, która bitowo obraca swój argument w lewo o 1 bit.
źródło
n << 1 | n >> 31
podrol
zamiastror
(oszczędność bajt).Python, 20 bajtów
Bitowy obrót w lewo o 1 bit.
źródło
MATL , 9 bajtów
Okrągłe przesunięcie 32-cyfrowej reprezentacji binarnej o krok w prawo.
Wypróbuj online!
źródło
Galaretka ,
108 bajtówZamienia najmniej znaczący ustawiony i nieuzbrojony bit.
Wypróbuj online!
Jak to działa
źródło
JavaScript (ES6),
3531 bajtówWyszukuje pierwsze przejście bitowe (0 → 1 lub 1 → 0) i odwraca je.
Próbny
Pokaż fragment kodu
Rotacja bitów, 14 bajtów
Znacznie krótszy, ale mniej zabawny.
Próbny
Pokaż fragment kodu
źródło
f(2147483647)
jest-1073741825
i(n=>n>>>31|n<<1)(2147483647)
jest-2
.k
jest początkowo ustawionyundefined
i korzystamy z faktu, że~undefined
jest równy-1
.Brain-Flak , 78 bajtów
Wypróbuj online!
Zwraca 2n, jeśli n <2 ^ 31, a 2n + 1-2 ^ 32 w przeciwnym razie. Niestety, ponieważ Brain-Flak nie ma szybkiego sposobu na określenie znaku liczby, program przekroczy limit czasu TIO, jeśli dane wejściowe różnią się od 2 ^ 31 o więcej niż około 500000.
Wyjaśnienie
Najpierw pchnij -2 ^ 32 na stos:
Następnie oblicz żądane dane wyjściowe:
źródło
dc, 10
Wypróbuj online .
Jest to arytmetyczna implementacja 32-bitowego obrotu w prawo:
źródło
Java 8,
1171729 bajtów+12 bajtów, zmieniając
int
nalong
, ponieważint
maksymalny rozmiar to2³¹-1
10089 bajtów zapisanych dzięki utworzeniu portu niesamowitej odpowiedzi Pythona na @AndersKaseorg .Wypróbuj tutaj.
Wyjścia:
Stara odpowiedź (
117118 bajtów):+1 bajt, zmieniając
int
nalong
, ponieważint
maksymalny rozmiar to2³¹-1
Wypróbuj tutaj.
Wyjścia:
źródło
Mathematica, 29 bajtów
Wypróbuj w piaskownicy Wolfram
Obraca arytmetycznie w lewo: najpierw pomnóż przez 2, co może przesunąć liczbę poza zakres, a następnie odetnij cyfrę poza zakresem za pomocą
Mod[...,2^32]
i dodaj ją ponownie po prawej za pomocą+Quotient[...,2^32]
.(Mathematica ma jedno wbudowane narzędzie, które daje moduł i iloraz za jednym razem, ale
QuotientRemainder
jest to trochę handicap golfowy…)źródło
APL, 12 bajtów
W jaki sposób?
źródło
05AB1E , 5 bajtów
Wypróbuj online!
Wyjaśnienie
Wykorzystuje sztuczkę, aby obrócić reprezentację binarną pozostawioną o 1 bit od odpowiedzi python Andersa Kaseorga .
źródło
R
42 42bajtyLosowo tasuje bity, ale sprawdza, czy przypadkiem nie zwróci tej samej liczby.
źródło
Biała spacja ,
8180 bajtów(1 bajt zapisany dzięki @ Ørjan Johansen przypominając mi, że dup jest krótszy niż push 0)
Wypróbuj online!
Zasadniczo implementuje cykliczną prawą przesunięcie bitów za pomocą arytmetyki liczb całkowitych. Przesuwanie dużej stałej jest drogie w Białej Przestrzeni, więc oszczędzamy niektóre bajty, naciskając 2 ^ 8 i dwukrotnie zwiększając kwadrat. (Oszczędza 1 bajt ponad (2 ^ 16) ^ 2 i 10 bajtów przez przepchnięcie 2 ^ 32 bezpośrednio.)
Wyjaśnienie
źródło
push 0
zdup
jednego polecenia wcześniej.Python 2.7, 89 bajtów
Pełny program:
Wypróbuj online!
Sugestie mile widziane! :)
źródło
Pari / GP , 15 bajtów
Wypróbuj online!
źródło
Japt , 5 bajtów
Bitowa rotacja, jak większość odpowiedzi tutaj.
Spróbuj
źródło
Perl 5
-p
, 39 bajtówWypróbuj online!
źródło
Python 3 , 45 bajtów
Wypróbuj online!
źródło
C ++ (gcc) ,
4539 bajtów-6 bajtów dzięki x pułapowi na catcat
Wypróbuj online!
źródło