Dla każdego dodatniej 32-bitowej liczby całkowitej ( 1 ≤ n ≤ 0xFFFFFFFF
) liczba bitów potrzebnych do przedstawienia tej liczby całkowitej.
Przypadki testowe
| n | n in binary | bits needed |
|----------------------------------|
| 1 | 1 | 1 |
| 2 | 10 | 2 |
| 3 | 11 | 2 |
| 4 | 100 | 3 |
| 7 | 111 | 3 |
| 8 | 1000 | 4 |
| 15 | 1111 | 4 |
| 16 | 10000 | 5 |
| 128 | 10000000 | 8 |
| 341 | 101010101 | 9 |
4294967295 => 11111111111111111111111111111111 => 32
Więc f(16)
wydrukuje lub wróci5
To jest golf golfowy . Najkrótszy kod w bajtach wygrywa
floor(log2(num))+1
num
jest potęga dwóch.Odpowiedzi:
05AB1E , 2 bajty
Wypróbuj online!
źródło
bg
bg
.bg
w grach oznaczabad game
:)JavaScript (ES6), 18 bajtów
źródło
n>>>1
wsparcien > 0x7FFFFFFF
?>>
zawiodło nan
tak wysokim poziomie. Dzięki.f=(a,b=1)=>a>1?f(a>>1,++b):b
Zestaw x86, 4 bajty
Zakładając stałą w
EBX
:EAX zawiera liczbę bitów niezbędną dla Constant.
Bajty:
☼¢├@
Szesnastkowy:
['0xf', '0xbd', '0xc3', '0x40']
źródło
Python , 14 bajtów
Wypróbuj online!
źródło
bit_length
jestbit_length()
.int.bit_length(n)
in.bit_length()
robią dokładnie to samo.int.bit_length(n)
to wywołanie funkcji , a zatem fragment kodu , który zakłada, że dane wejściowe są przechowywane w zmiennej. Nie jest to dozwolone przez nasze zasady, więc dodanie(n)
spowoduje, że ta odpowiedź będzie nieważna. Jednakint.bit_length
ewaluuje do funkcji i może być zapisany w zmiennej do późniejszego użycia. Jest to domyślnie dozwolone.Labirynt ,
1312 bajtówWypróbuj online!
Wyjaśnienie
Program po prostu wielokrotnie dzieli wejście przez 2, aż do zera. Liczbę kroków śledzi się, powielając wartość na każdym kroku. Po zmniejszeniu do zera drukujemy głębokość stosu (minus 1).
Program rozpoczyna się od tego,
?
który odczytuje dane wejściowe. Główna pętla to blok 2x2 poniżej, idący w kierunku przeciwnym do ruchu wskazówek zegara:Gdy po pełnej iteracji wartość wynosi zero, wykonywany jest bit liniowy na końcu:
źródło
C, 31 bajtów
... Potem pomyślałem o rekurencji. Od niejasnych do oczywistych, a jedna czwarta długości spadła.
Zobacz na żywo na Coliru
C, 43 bajtyWywołanie
f
z wartością bez znaku (np.f(42u)
) „Zwróci” swoją długość bitu. Nawet działa dla0u
!Nieoznakowane i wyjaśnione: (pominięto ukośniki odwrotne)
Zobacz na żywo na Coliru
źródło
n?...:0
nie jest konieczne.#define f(n) ({64-__builtin_clzl(n);})
podejścia.Mathematica, 9 bajtów
Alternatywnie:
źródło
Perl 6 , 7 bajtów
Spróbuj
Wyjaśnienie:
*
sprawia, że staje się on lambda WhokolwiekCode i wskazuje, gdzie umieścić dane wejściowe.msb
na Int zwraca indeks najbardziej znaczącego bitu (w oparciu o 0)+1
jest łączony w lambda i dodaje jeden do ostatecznego wyniku wywołania.msb
.źródło
Makro preprocesora C (z rozszerzeniami gcc), 26
Wykorzystuje wbudowane liczniki wiodące zer GCC .
Nazwij to jako funkcję, np
f(100)
.Wypróbuj online .
źródło
Siatkówka ,
5637 bajtówTo rozwiązanie działa ze wszystkimi wymaganymi wartościami wejściowymi.
Największym problemem, z którym mierzy się Retina w tym wyzwaniu, jest to, że jego łańcuchy mają maksymalną długość 2 ^ 30 znaków, więc zwykły sposób radzenia sobie z liczbami (reprezentacja jedności) nie działa z wartościami większymi niż 2 ^ 30.
Aby rozwiązać ten problem, podjąłem inne podejście, zachowując rodzaj dziesiętnej reprezentacji liczb, ale gdzie każda cyfra jest zapisywana w jedności (nazywam tę reprezentację cyfrową ). Na przykład numer
341
byłby zapisany jak111#1111#1#
w cyfrowej. Dzięki tej reprezentacji możemy teraz pracować z liczbami do2^30/10
cyfr (~ sto milionów cyfr). Jest mniej praktyczny niż standardowe jednoargumentowe dla dowolnej arytmetyki, ale przy odrobinie wysiłku możemy wykonać dowolne operacje.Algorytm, którego użyłem, dokonuje kolejnych podziałów całkowitych o dwa, aż osiągniemy zero, liczba dokonanych podziałów to liczba bitów potrzebna do przedstawienia tej liczby.
Jak dzielimy przez dwa cyfrowo? Oto fragment kodu Retina:
Ta zamiana wystarczy, aby podzielić cyfrę cyfrową przez 2, wystarczy usunąć ewentualne 0,5 s od końca, jeśli oryginalny numer był nieparzysty.
Oto pełny kod, dzielimy przez dwa, dopóki cyfry nie będą zawierać cyfr, i umieszczamy literę
n
przed ciągiem przy każdej iteracji: liczban
na końcu jest wynikiem.Wypróbuj online!
Zaktualizowane rozwiązanie, 37 bajtów
Wielkie refaktoryzacja z wieloma dobrymi pomysłami, które grały w golfa na około jednej trzeciej długości, wszystko dzięki Martinowi Enderowi!
Główną ideą jest użycie
_
jako naszego jednoznacznego symbolu: w ten sposób możemy używać regularnych cyfr w naszym ciągu, o ile przekonwertujemy je z powrotem na_
s, gdy jest to potrzebne: pozwala nam to zaoszczędzić wiele bajtów na dzieleniu i wstawianiu wielu cyfryOto kod:
Wypróbuj online!
źródło
Ruby,
1916 bajtówDzięki Jordan za grę w golfa z 3 bajtów
źródło
%
:->n{("%b"%n).size}
.->n{"%b"%n=~/$/}
.Jolf, 2 bajty
Wystarczy przekonwertować na plik binarny, a następnie znaleźć długość.
źródło
Julia 0.4 , 14 bajtów
Wypróbuj online!
źródło
JavaScript ES6, 19 bajtów
Math.clz32
zwraca liczbę wiodących zerowych bitów w 32-bitowej binarnej reprezentacji liczby. Aby uzyskać wymaganą liczbę bitów, wystarczy odjąć tę liczbę od 32źródło
a=>1+Math.log2(a)|0
jest również 19 bajtów.1+...|0
krzyczy minus tylda !a=>-~Math.log2(a)
jest 18narzędzia bash / Unix, 16 bajtów
Zapisz to w skrypcie i przekaż dane wejściowe jako argument. Zostanie wydrukowana liczba bitów wymagana do przedstawienia tej liczby w systemie binarnym.
Oto wyjaśnienie:
dc jest kalkulatorem stosowym. Dane wejściowe, pogrupowane w tokeny, to:
2 - Naciśnij 2 na stosie.
o - Usuń wartość ze stosu (która wynosi 2) i ustaw ją jako bazę wyjściową (tak więc dane wyjściowe są teraz w formacie binarnym).
Wartość argumentu dla programu bash ($ 1) - Wciśnij ten argument na stos.
n - Usuń wartość ze stosu (która jest liczbą wejściową) i wydrukuj ją (binarnie, ponieważ jest to baza wyjściowa) bez końca nowej linii.
Więc polecenie dc wypisuje liczbę w formacie binarnym.
Dane wyjściowe dc są przesyłane do polecenia wc z opcją -c, która wypisuje liczbę znaków na wejściu.
Końcowym rezultatem jest wydrukowanie liczby cyfr w binarnej reprezentacji argumentu.
źródło
Arkusze Google, 15 bajtów
Pobiera dane wejściowe z komórki
A1
i dane wyjściowe do komórki zawierającej formułęlub
lub
Excel, 17 bajtów
Taki sam jak powyżej, ale sformatowany dla MS Excel
lub
lub
źródło
Pyth, 3 bajty
Zestaw testowy dostępny tutaj.
Wyjaśnienie
źródło
hsl
lub.El
, w któryml
oblicza podstawę log 2,hs
lub.E
oblicza sufit.Galaretka, 2 bajty
Konwertuje na binarne, znajduje długość.
źródło
C #,
634531 bajtówZaoszczędzono 18 bajtów dzięki Loovjo i TuukkaX
Zaoszczędzono 14 bajtów dzięki Grax
Wykorzystuje to, że liczba dziesiętna n ma ⌊log2 (n) ⌋ + 1 bit, co jest opisane na tej stronie:
źródło
...)+ 1)...
->...)+1...
. Myślę też, że możesz zwrócić wartość bezpośrednio zamiast jej wydrukować.b=>1+(int)System.Math.Log(b,2);
Konwersja int zapewnia takie same wyniki jak Math.Floor i nie potrzebujesz instrukcji using, jeśli odwołujesz się do Systemu tylko raz.C #, 32 bajty
Konwertuje parametr na ciąg binarny i zwraca długość ciągu.
źródło
Haskell, 20 bajtów
Tworzy funkcję, która pobiera podstawę logarytmu 2, podłogi i dodaje 1.
źródło
Befunge-93 ,
2321 bajtówBefunge to język oparty na siatce 2D (chociaż używam tylko jednej linii).
Wypróbuj online!
źródło
Meduza , 4 bajty
Wypróbuj online!
Print (
p
), długość (#
) reprezentacji binarnej (b
) wejścia (i
).źródło
CJam , 5 bajtów
Wypróbuj online!
Odczytaj input (
r
), przekonwertuj na liczbę całkowitą (i
), uzyskaj reprezentację binarną (2b
), pobierz length (,
).źródło
Oktawa , 19 bajtów
Anonimowa funkcja, która dodaje 1, oblicza logarytm binarny i zaokrągla w górę.
Wypróbuj online!
źródło
QBIC , 18 bajtów
To niesamowite Mike! Ale jak to działa?
źródło
Java 8,
3427 bajtówPo raz pierwszy Java ma kilka przydatnych funkcji wbudowanych! Teraz potrzebujemy tylko krótszych nazw ...
Wypróbuj online!
Oczywiście możesz to zrobić bez wbudowanych funkcji ( patrz odpowiedź Snowmana ), ale dla większej liczby bajtów.
źródło
Oktawa, 19 bajtów
Oktawa ma dwie funkcje do konwersji liczb dziesiętnych na liczby binarne.
dec2bin
konwertuje liczbę na ciąg znaków1
i0
(wartości ASCII48
i49
). Długość łańcucha będzie równa niezbędnej liczbie bitów, chyba że określono inaczej. Ponieważ znaki1
i0
są niezerowe, możemy użyćnnz
, aby znaleźć szereg elementów, takich jak ten:@(x)nnz(dec2bin(x))
. Jest to 19 bajtów, więc jest powiązany z inną odpowiedzią Luisa Mendo Octave .Czy możemy to zrobić lepiej
de2bi
?de2bi
jest funkcją, która zwraca liczby binarne jako wektor z liczbami1
i0
jako liczby całkowite, a nie znaki.de2bi
jest oczywiście dwa bajty krótszy niżdec2bin
, ale nie możemy już używaćnnz
. My może używaćnnz
gdybyśmy albo dodawać1
do wszystkich elementów, lub robi to w logiczną wektora z tylkotrue
wartości.@(x)nnz(de2bi(x)+1)
i@(x)nnz(de2bi(x)<2)
oba mają 19 bajtów. Użycienumel
da nam również 19 bajtów,@(x)numel(de2bi(x))
.rows
jest o jeden bajt krótszy niżnumel
, alede2bi
zwraca wektor poziomy, więc musi zostać transponowany.@(x)rows(de2bi(x)')
akurat jest też 19 bajtów.źródło
Pyke, 3 bajty
Wypróbuj tutaj!
źródło
Retina ,
4423 bajtówWymaga zbyt dużej ilości pamięci, aby działać dla dużych wartości wejściowych. Konwertuje na unary, a następnie wielokrotnie dzieli przez 2, licząc ile razy, aż osiągnie zero. Liczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online
źródło