Problem:
Znajdź liczbę zer wiodących w 64-bitowej liczbie całkowitej ze znakiem
Zasady:
- Dane wejściowe nie mogą być traktowane jako ciąg; może to być wszystko, gdzie algorytm steruje operacjami matematycznymi i bitowymi
- Dane wyjściowe powinny zostać sprawdzone pod kątem 64-bitowej liczby całkowitej ze znakiem, niezależnie od języka
- Obowiązują domyślne zasady gry w golfa
- Najkrótszy kod w bajtach wygrywa
Przypadki testowe:
Testy te zakładają liczby całkowite ze znakiem uzupełnienia do dwóch. Jeśli w Twoim języku / rozwiązaniu brakuje innej reprezentacji liczb całkowitych z podpisem, zadzwoń i podaj dodatkowe przypadki testowe, które mogą być istotne. Dołączyłem kilka przypadków testowych, które dotyczą podwójnej precyzji, ale możesz zaproponować inne, które powinny zostać wymienione.
input output 64-bit binary representation of input (2's complement)
-1 0 1111111111111111111111111111111111111111111111111111111111111111
-9223372036854775808 0 1000000000000000000000000000000000000000000000000000000000000000
9223372036854775807 1 0111111111111111111111111111111111111111111111111111111111111111
4611686018427387903 2 0011111111111111111111111111111111111111111111111111111111111111
1224979098644774911 3 0001000011111111111111111111111111111111111111111111111111111111
9007199254740992 10 0000000000100000000000000000000000000000000000000000000000000000
4503599627370496 11 0000000000010000000000000000000000000000000000000000000000000000
4503599627370495 12 0000000000001111111111111111111111111111111111111111111111111111
2147483648 32 0000000000000000000000000000000010000000000000000000000000000000
2147483647 33 0000000000000000000000000000000001111111111111111111111111111111
2 62 0000000000000000000000000000000000000000000000000000000000000010
1 63 0000000000000000000000000000000000000000000000000000000000000001
0 64 0000000000000000000000000000000000000000000000000000000000000000
False
zamiast0
?Odpowiedzi:
język maszynowy x86_64 w systemie Linux, 6 bajtów
Wymaga procesora Haswell lub K10 lub nowszego z
lzcnt
instrukcją.Wypróbuj online!
źródło
Sześciokąt ,
7870 bajtówWypróbuj online!
Czy to wyzwanie nie jest zbyt trywialne dla praktycznego języka? ;)
długość boku 6. Nie mogę go dopasować do sześciokąta o długości boku 5.
Wyjaśnienie
źródło
Python , 31 bajtów
Wypróbuj online!
Expresson składa się
&
z dwóch części:67-len(bin(-n))
Daje poprawną odpowiedź na wejściach nieujemnych. Bierze długość bitu i odejmuje od 67, czyli 3 więcej niż 64, aby skompensować-0b
prefiks. Negacja jest sztuczką, która pozwala dostosować się don==0
tego, że negowanie nie powoduje pojawienia się-
znaku z przodu.To
& ~n>>64
sprawia, że odpowiedź jest0
negatywnan
. Kiedyn<0
,~n>>64
jest równa 0 (na 64-bitowe liczby całkowite), a więc z-ing to daje0
. Kiedyn>=0
The~n>>64
ocenia się-1
, i robi&-1
nie ma znaczenia.Python 2 , 36 bajtów
Wypróbuj online!
Alternatywa arytmetyczna.
źródło
Java 8,
3226 bajtów.Long::numberOfLeadingZeros
Wbudowane FTW.
-6 bajtów dzięki Kevin Cruijssen
Wypróbuj online!
źródło
numberOfLeadingZeros
.. Możeszn->n.numberOfLeadingZeros(n)
Long::numberOfLeadingZeros
jest jeszcze krótszy (26 bajtów).C (gcc) , 14 bajtów
Działa dobrze na tio
C (gcc) ,
3529 bajtówWypróbuj online!
Niż Dennis za 6 bajtów
Flagi kompilatora C (gcc) , 29 bajtów autorstwa Davida Foerstera
Wypróbuj online!
źródło
__builtin_clzl
z którym mogę wymyślić .long
jest 32 bity (w tym Windows x64), potrzebujesz__builtin_clzll
(długi bez znaku). godbolt.org/z/MACCKf . (W przeciwieństwie do intrinsics Intela, wbudowane GNU C są obsługiwane niezależnie od operacji wykonywanej za pomocą jednej instrukcji maszyny. Na 32-bitowym x86 clzll kompiluje się do gałęzi lub cmov do zrobienialzcnt(low half)+32
lublzcnt(high half)
. Lubbsr
jeślilzcnt
nie jest dostępne.__builtin_clz(l)(l)
zachowanie jest niezdefiniowane dla zera: „Jeśli x wynosi 0, wynik jest niezdefiniowany”.Perl 6 ,
35 2826 bajtów-2 bajty dzięki nwellnhof
Wypróbuj online!
Anonimowy blok kodu, który pobiera liczbę i zwraca liczbę. Konwertuje to liczbę na ciąg binarny i zlicza zera wiodące. Działa dla liczb ujemnych, ponieważ pierwszym znakiem jest
-
np.-00000101
, Więc nie ma zer wiodących.Wyjaśnienie:
źródło
JavaScript (Node.js) , 25 bajtów
Pobiera dane wejściowe jako literał BigInt.
Wypróbuj online!
źródło
n=>n<1?0:n.toString(2)-64
wykona tego samego?n=>n<1?0:n.toString(2).length-64
, ale to i tak nie zadziała. To , jak sądzę..toString()
podejście działa, ale nadal potrzebujemy literału BigInt jako danych wejściowych. W przeciwnym razie mamy tylko 52 bity mantysy, co prowadzi do nieprawidłowych wyników w przypadku utraty precyzji .Python 3 , 34 bajty
Wypróbuj online!
źródło
J , 18 bajtów
Wypróbuj online!
J , 19 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
1#.[:*/\1-_64{.#:
(17) jest blisko, ale nie działa dla liczb ujemnych :(Perl 6 , 18 bajtów
-2 bajty dzięki Jo King
Wypróbuj online!
źródło
Ruby , 22 bajty
Wypróbuj online!
źródło
05AB1E ,
109 bajtówI / O są liczbami całkowitymi
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Haskell , 56 bajtów
Dzięki xnor za wykrycie błędu!
Może przydzielić sporo pamięci, spróbuj online!
Może chcesz przetestować to z mniejszą stałą: Wypróbuj 8-bit!
Wyjaśnienie
mapM(pure[0,1])[1..64]
mapM(pure[1,0])[1..64]
sum.fst.span(>0)
źródło
PowerShell, 51 bajtów
Skrypt testowy:
Wynik:
źródło
Java 8, 38 bajtów
Wejście jako
long
(64-bitowa liczba całkowita), wyjście jakoint
(32-bitowa liczba całkowita).Port odpowiedzi C (gcc) @ l4m2 .
Wypróbuj online.
Wyjaśnienie:
EDYCJA: Może być 26 bajtów przy użyciu wbudowanego
Long::numberOfLeadingZeros
wyświetlanego w odpowiedzi Java 8 @lukeg .źródło
APL + WIN, 34 bajty
Wyjaśnienie:
źródło
C # (interaktywny kompilator Visual C #) , 42 bajty
Wypróbuj online!
C # (interaktywny kompilator Visual C #) , 31 bajtów
Jeszcze krótszy, oparty na odpowiedzi C (gcc) @ l4m2. Nigdy nie wiedziałem, że możesz zadeklarować takie funkcje, dzięki @Dana!
Wypróbuj online!
źródło
Galaretka ,
109 bajtów-1 dzięki zgrabnej sztuczce Erika the Outgolfer (nie-negatywne jest teraz po prostu
AƑ
)Łącze monadyczne akceptujące liczbę całkowitą (w zakresie), która daje liczbę całkowitą.
Wypróbuj online! Lub zobacz zestaw testowy .
10 było
ḤBL65_ɓ>-×
Oto kolejne 10-bajtowe rozwiązanie, które lubię, ponieważ mówi, że to „BOSS” ...
Zestaw testowy tutaj
...
BoṠS63r0¤i
,BoṠS63ŻṚ¤i
lubBoṠS64ḶṚ¤i
też będzie działać.Kolejne 10 bajtów (od Dennisa) to
æ»64ḶṚ¤Äċ0
(znowuæ»63r0¤Äċ0
iæ»63ŻṚ¤Äċ0
będzie działać)źródło
Ƒ
szybkiej, bardzo miłej pracy!AƑ
. Ostrzegamy, że nie jest wektoryzowany! ;-) W rzeczywistości „spłaszcza, a następnie sprawdza, czy wszystkie elementy są nieujemne”.Perl 5 , 37 bajtów
Wypróbuj online!
Lub te 46 bajtów, jeśli „strityfikacja” jest niedozwolona: sub z
źródło
s/length$&/$+[0]/
(-3 bajty);)sub
słowa kluczowego z odpowiedzi zawierających funkcje Perla 5.sub
w odpowiedziach dla innych języków, Perl6, PowerShell i innych.sub{}
tworzyć (anonimowego?) Napisu, który wyjaśnia, dlaczego został pominięty w odpowiedziach na Perl6. Zgadzam się z @nwellnhof, że nie powinno się zezwalać na usunięciesub
. (kiedy byłem jeszcze aktywny, jak rok temu, taka była reguła)$+[0]
.Szybki (na platformie 64-bitowej), 41 bajtów
Deklaruje zamknięcie o nazwie,
f
które przyjmuje i zwraca anInt
. To rozwiązanie działa poprawnie tylko platformy 64-bitowe, gdzieInt
jesttypealias
ed doInt64
. (Na platformie 32-bitowejInt64
można jawnie użyć dla typu parametru zamknięcia, dodając 2 bajty).W Swift nawet podstawowy typ liczb całkowitych jest zwykłym obiektem zadeklarowanym w standardowej bibliotece. Oznacza to, że
Int
mogą mieć metody i właściwości, takie jakleadingZeroBitCount
(które są wymagane na wszystkich typach zgodnych zFixedWidthInteger
protokołem standardowej biblioteki ).źródło
Haskell , 24 bajty
Wypróbuj online!
Jest to w zasadzie to samo co rozwiązanie Java Kevina Cruijssena, ale znalazłem je niezależnie.
Argument powinien mieć typ
Int
dla kompilacji 64-bitowej lubInt64
cokolwiek innego.Wyjaśnienie
Jeśli argument jest ujemny, wynik wynosi natychmiast 0. W przeciwnym razie przesuwamy się w lewo, wypełniając je , aż osiągniemy liczbę ujemną. To wypełnienie pozwala nam uniknąć specjalnego przypadku na 0.
Dla porównania, oto oczywisty / skuteczny sposób:
34 bajty
źródło
Czysty , 103 bajty
Używa tego samego „wbudowanego” co odpowiedź sufitu.
Wypróbuj online!
Czysty , 58 bajtów
Wypróbuj online!
źródło
Stax , 10 bajtów
Uruchom i debuguj
To port rozwiązania 05AB1E Kevina.
źródło
Perl 5
-p
, 42 bajtówWypróbuj online!
Dłuższe niż rozwiązanie oparte na łańcuchach bitowych, ale przyzwoite rozwiązanie matematyczne.
źródło
int
zaproszeniu, które powinny rozwiązać ten problem.APL (NARS), 15 znaków, 30 bajtów
przetestuj kilka liczb, aby zobaczyć, jak używać:
źródło
Rdza, 18 bajtów
Wypróbuj online!
źródło
K (ngn / k) , 6 bajtów
Wypróbuj online!
2\
zakoduj argument w formacie binarnym#
długość64-
odejmij od 64źródło
# = length
... wygląda na ciąg znaków2\
podaje listę liczb całkowitych i określa#
jej długość. nie ma tu żadnych zobowiązań.PHP,
5046 bajtówUruchom jako potok z
-R
lub wypróbuj go online ,<?=$argn<0?0:0|64-log($argn+1,2);
ma problemy z zaokrąglaniem; więc przeszedłem długą drogę.źródło
Wolfram Language (Mathematica) , 41 bajtów
Wzór na liczby dodatnie jest sprawiedliwy
63-Floor@Log2@#&
. Reguły wymiany są stosowane w specjalnych przypadkach zerowego i ujemnego wkładu.Dane wejściowe nie muszą być 64-bitową liczbą całkowitą ze znakiem. To skutecznie zabierze głos na wejściu, aby przekształcić go w liczbę całkowitą. Jeśli wprowadzisz liczbę poza normalnymi granicami dla 64-bitowej liczby całkowitej, wyświetli ona liczbę ujemną wskazującą, ile więcej bitów będzie potrzebnych do zapisania tej liczby całkowitej.
Wypróbuj online!
@ Rozwiązanie LegionMammal978 jest nieco krótsze i ma 28 bajtów. Dane wejściowe muszą być liczbą całkowitą. Według dokumentacji: „
BitLength[n]
jest efektywną wersjąFloor[Log[2,n]]+1
”. Automatycznie obsługuje przypadek zerowego raportowania0
zamiast-∞
.Wolfram Language (Mathematica) , 28 bajtów
Wypróbuj online!
źródło
Boole[#>=0](64-BitLength@#)&
jest o wiele krótszy i ma 28 bajtów. Używa tej samej podstawowej koncepcji, co twoja, ale stosuje sięBitLength
iBoole
.bitNumber - math.ceil (math.log (number) / math.log (2))
np. 64-bitowy NUMER: 9223372036854775807 math.ceil (math.log (9223372036854775807) / math.log (2)) ANS: 63
źródło