Biorąc pod uwagę liczbę całkowitą z zakresu 0 <= n < 2**64
, wyprowadzaj pojemnik o minimalnej wielkości, w którym mógłby się zmieścić
- bit: 1
- skubać: 4
- bajt: 8
- krótki: 16
- int: 32
- długie: 64
Przypadki testowe:
0 -> 1
1 -> 1
2 -> 4
15 -> 4
16 -> 8
123 -> 8
260 -> 16
131313 -> 32
34359750709 -> 64
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
2
był równieżOdpowiedzi:
05AB1E , 10 bajtów
Wyjaśnienie
Wypróbuj online!
źródło
Python, 39 bajtów
Zlicza, ile razy należy wziąć pierwiastek kwadratowy,
n
aby znaleźć się poniżej16
, ze specjalną obudową, aby uniknąć wyników 2.Gdyby uwzględniono 2, moglibyśmy to zrobić
z wartością True dla 1.
41 bajtów:
Wielokrotnie podwaja wykładnik wykładniczy
i
do2**i>n
. Pomija odi=1
doi=4
, przesuwając dodatkowy bit, gdyi
jest nieparzysty.Alt 45 bajtów:
źródło
1
gdy pierwiastek kwadratowy z 0 lub 1 wynosi zawsze 1 (nieskończona rekurencyjność wor 2*f(n**.5)
)?or
jest oceniana tylko wtedy, gdy część przedtem ocenia się na coś fałszywego (zero). Dla n = 0, a dla n = 1,n>1
ocenia naFalse
, który jest traktowany jako zero w wyrażeniu numerycznym, in<16
ocenia naTrue
, który jest traktowany jako jeden w wyrażeniu numerycznym. Podobnie4**(n>1)*(n<16)
jest 1.J, 19 bajtów
Czasownik monadyczny biorąc numer po prawej i wypluwając rozmiar pojemnika. Istnieje kilka równoważnych sposobów pisania, więc zawarłem oba.
Wyjaśnione przez wybuch:
Fajne jest to, że widzimy dwa różne sposoby przyjmowania logarytmicznej bazy 2 w J. Pierwszy jest oczywisty
2^.
, czyli logarytm numeryczny. Drugi to#@#:
, który można odczytać jako „długość reprezentacji base-2”. Jest to prawie równoważne jednemu plus-piętro-log-base-2, z tym wyjątkiem, że#:0
jest to lista jednoelementowa0
, która jest dokładnie tym, czego chcemy. To bije1+2<.@^.1&>.
o 8 bajtów.W użyciu w REPL:
Stare, zbyt sprytne 20-bajtowe rozwiązanie.
źródło
Python,
535049 bajtówźródło
lambda n:[w for w in[1,4,8,16,32,64]if n<2**w][0]
jest o jeden bajt krótszyMathematica,
443938 bajtówDzięki @orlp za 5 bajtów i @MartinEnder za 1 bajt.
Znajduje pierwsze elementy na liście w
{1, 4, 8, 16, 32, 64}
taki sposób, że liczba 2 ^ jest większa niż wartość wejściowa.źródło
Pip , 19 bajtów
Wypróbuj online!
Jak to działa
źródło
JavaScript (ES7), 35 bajtów
źródło
f=(n,b=1)=>2**b>n&&b-2?b:f(n,b*2)
powinna być nieco krótsza.Mathematica,
464338 bajtówDzięki JungHwan Min i Martin Ender za oszczędność 3 bajtów! Dzięki ngenisis za duże 5-bajtowe oszczędności!
Nienazwana funkcja przyjmująca nieujemną liczbę całkowitą jako dane wejściowe i zwracająca liczbę całkowitą dodatnią.
BitLength@#
oblicza liczbę bitów na wejściu, a następnie2^⌈Log2@...⌉
oblicza najmniejszą potęgę 2, która jest co najmniej tak duża jak liczba bitów. Wreszcie/.{2->4,0->1}
zajmuje się specjalnym przypadkiem, w którym nie ma „niblit” między bitem a nybble, a także naprawia odpowiedź na dziwne dane wejściowe0
.źródło
BitLength@#
zamiast⌊1+Log2@#⌋
. Wtedy zamiast zastąpienia∞
z1
was może zastąpić0
, zapisując kolejne 2 bajty i jesteś przywiązany do pierwszego.BitLength
. Zobacz moją odpowiedźJulia, 40 bajtów
Jest to anonimowa funkcja, która generuje tablicę potęg 2 od 0 do 6, wyłączając 2, i filtruje ją tylko do tych elementów x , że 2 x jest większe niż wejście. Pierwszym takim elementem jest odpowiedź. Niestety wymaga to podwyższenia 2 do a,
BigInt
aby uniknąć przepełnienia x = 64.W rzeczywistości jest to dość podobne do odpowiedzi Python w orlp, chociaż nie widziałem jej przed wymyśleniem tego podejścia.
Wypróbuj online!
źródło
Perl 6 , 30 bajtów
+<
jest operatorem przesunięcia bitów w lewo Perla 6, który nazywa wiele innych języków<<
.źródło
Haskell, 31 bajtów
32 bajty alt:
źródło
Java, 143 bajty.
źródło
return a<2?1:a<5?4:a<9?8:a<17?16:a<33?32:64;
Haskell, 43 bajty
źródło
Rubin,
3936 bajtówDzięki GB za pomoc w golfa
źródło
Java 8,
6555 bajtówTo wyrażenie lambda, które przyjmuje
long
a zwraca anint
. Nigdy wcześniej nie grałem w golfa w Javie, więc powinno to być łatwe do pokonania:Wypróbuj online!
Dla 47 bajtów moglibyśmy mieć:
Jednak
1L<<i
przepełnienie dla zwracanych wartości większych niż 32, więc nie powiedzie się to w przypadku ostatecznej skrzynki testowej.źródło
4
gdy testujemy,16
kiedy ma on powrócić 8. Ponadto możesz jeszczei<<=1+i%2;
{}
Mathematica, 30 bajtów
Wyjaśnienie:
Niech
N
będzie zbiorem nieujemnych liczb całkowitych. Zdefiniować dwie funkcje, naN
,BitLength
iNextPower
, co następuje:To rozwiązanie zasadniczo oblicza na
NextPower(BitLength(n))
podstawie liczby całkowitejn >= 0
. Dlan > 0
widzimy, żeNextPower(n) = 2^BitLength(n-1)
takNextPower(BitLength(n)) = 2^BitLength(BitLength(n)-1)
.Teraz
BitLength
wbudowana Mathematica zgadza się z podaną przeze mnie definicjąn >= 0
. Dlan < 0
,BitLength[n] == BitLength[BitNot[n]] == BitLength[-1-n]
takBitLength[-1] == BitLength[0] == 0
. W ten sposób otrzymujemy pożądaną odpowiedź1
nan==0
.Ponieważ pominąć prosto z kawałka skubać, musimy wymienić odpowiedziami
2
z4
.źródło
bash,
49 bajtów48 bajtówlub
Zapisz w skrypcie i przekaż jako argument liczbę do przetestowania.
Edycja: Zastąpiony || z |, który działa, ponieważ argumentami są zawsze 0 lub 1.
Uwaga: Działa to dla liczb całkowitych do największej dodatniej liczby całkowitej, którą może obsługiwać twoja wersja bash. Jeśli będę miał czas, zmodyfikuję go tak, aby działał do 2 ^ 64-1 w wersjach bash, które używają 32-bitowej arytmetyki ze znakiem.
Tymczasem oto 64-bajtowe rozwiązanie, które działa na dowolnie duże liczby (w dowolnej wersji bash):
źródło
Skumulowane,
3430 bajtówlub
Pierwszy pobiera dane wejściowe do TOS i pozostawia dane wyjściowe w TOS; drugi jest funkcją. Wypróbuj tutaj!
Wyjaśnienie
Oto przykład jego działania na replice :
Przypadki testowe
Lub jako pełny program:
źródło
Rakieta 45 bajtów
Nie golfowany:
Inne wersje:
i przy użyciu długości łańcucha:
Testowanie:
Wynik:
źródło
Oktawa,
40 36 3129 bajtówProsta anonimowa funkcja. Zakłada się, że wartość wejściowa jest liczbą całkowitą - patrz zastrzeżenie na końcu.
Kod działa w następujący sposób:
Najpierw tworzona jest tablica dozwolonych długości bitów (1,4,8,16,32,64) i zapisywana w niej
b
.Następnie znajdujemy liczbę bitów wymaganą do przechowywania liczby wejściowej
a
poprzez porównanie z maksymalnym rozmiarem każdego pojemnika,b
aby zobaczyć, które są wystarczająco duże.Następnie wykorzystujemy uzyskany wektor indeksu, aby ponownie wyodrębnić rozmiar kontenera
b
.Wreszcie bierzemy pierwszy element z wynikowej tablicy, która będzie najmniejszym możliwym pojemnikiem.
Możesz spróbować online tutaj .
Po prostu uruchom następujący kod, a następnie zrób
ans(x)
.Jedynym zastrzeżeniem jest to, że podwójna precyzja jest domyślnie używana dla stałych, co oznacza, że działa tylko z liczbami do najwyższej wartości reprezentowanej przez zmiennoprzecinkowe podwójnej precyzji, która jest mniejsza niż 2 ^ 64.
Można to naprawić, upewniając się, że liczba podawana do funkcji jest liczbą całkowitą, a nie podwójną. Można to osiągnąć poprzez wywołanie funkcji na przykład:
ans(uint64(x))
.źródło
PHP,
494644 bajtówUruchom tak:
Wyjaśnienie
Poprawki
$r=
zadania-R
aby$argn
udostępnićźródło
CJam , 18 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
C,
7152 bajtówźródło
(1<<15)+1
lub więcej nie złamałoby tego z powodu podpisanego zachowanialong long
? Typ naprawdę chcesz touint64_t
co wymaga#include <stdint.h>
co jest jeszcze przegrany w porównaniuunsigned long long
! Główki są zmorą gry w golfa w c.unsigned long long
lubuint64_t
, ale ponieważ wydaje się, że to działalong long
, poszedłem z tym.QBIC , 27 bajtów
Wyjaśnienie
źródło
Pyke, 13 bajtów
Wypróbuj tutaj!
źródło
PHP, 43 bajty
Uruchom z
echo <number> | php -R '<code>'
.zapętla
$i
się, aż2**(2**$i)
będzie większy niż wejście. (Tweak:<<
zamiast**
eliminować parens)Po pętli $ i jest o jeden za wysoki; więc przed obliczeniem wyniku otrzymuje dekrement
- ale nie dla
$i==2
.źródło