Wyzwanie
Biorąc pod uwagę liczbę całkowitą w 32-bitowym formacie uzupełnienia do dwóch , zwraca indeks drugiej najmniej znaczącej cyfry zero w reprezentacji binarnej, gdzie indeks 0
reprezentuje najmniej znaczący bit, a indeks 31
reprezentuje najbardziej znaczący bit.
Jeśli nie ma drugiego zera, możesz zwrócić 0, dowolną liczbę ujemną, dowolną wartość fałszowania lub zgłosić błąd w sposób, który ma sens w twoim języku.
Jeśli wolisz, możesz użyć indeksowania 1, ale poniższe przypadki testowe będą używać indeksowania 0.
Możesz użyć liczb całkowitych bez znaku, jeśli wolisz; jeśli to zrobisz, musisz obsługiwać liczby całkowite w zakresie [0, 2^32)
. Jeśli używasz liczb całkowitych ze znakiem, musisz obsługiwać liczby całkowite z zakresu [-2^31, 2^31)
. Przypadki testowe wykorzystają tutaj liczby całkowite ze znakiem, ale należy pamiętać, że -x
(podpisany) jest 2^32 - x
(niepodpisany).
Przypadki testowe
0 (0b00) -> 1 1 (0b001) -> 2 10 (0b1010) -> 2 11 (0b01011) -> 4 12 (0b1100) -> 1 23 (0b010111) -> 5 -1 (0b11..11) -> Brak -2 (0b11..10) -> Brak -4 (0b11..00) -> 1 -5 (0b11..1011) -> Brak -9 (0b11..10111) -> Brak 2 ^ 31-2 (0b0111..1110) -> 31
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w każdym języku!
[0, 2^32)
.0b...
wejściu liczbę całkowitą lub ciąg ?2^32-1
nie powinienem wracać33
.Odpowiedzi:
Python 2 , 45 bajtów
Wypróbuj online!
Używa indeksowania 0, liczb bez znaku i zgłasza błąd nie zerując drugiego zera.
Po prostu tworzy listę indeksów nie ustawionych bitów, od najniższego do najwyższego, i zwraca drugi wpis.
źródło
JavaScript (ES6), 34 bajty
Zwraca indeks oparty na 0 lub
-1
jeśli nie znaleziono drugiego zera.Przypadki testowe
Pokaż fragment kodu
Alternatywne wyrażenie
Wersja rekurencyjna, 42 bajty
Zwraca indeks oparty na 0 lub
false
jeśli nie znaleziono drugiego zera.W jaki sposób?
Przypadki testowe
Pokaż fragment kodu
Alternatywna wersja sugerowana przez Neila, 41 bajtów
Zwraca indeks oparty na 0 lub generuje zbyt duży błąd rekurencji, jeśli nie zostanie znalezione drugie zero.
źródło
f=(n,c=1)=>n%2?1+f(~-n/2,c):c&&1+f(n/2,0)
Galaretka , 7 bajtów
Wypróbuj online!
Wyprowadza coś poza zakresem [1,31], jeśli nie ma drugiego zera. Obejmuje to
32
33
i(-inf+nanj)
. To chyba ma sens.Oblicza
log(((x|(x+1))+1)&~x)/log(2)
.źródło
-inf+nanj
Nie sądziłem, że może to nawet istnieć(-inf+nanj)
wejściowych,2147483647
których binarna reprezentacja wynosi 31 1s, a zatem nie ma drugiego zera w 32-bitowej notacji ze znakiem (dlatego jest o wiele krótsza niż moja i odpowiedzi Erika).(-inf+nanj)
?Java, ...
194 191186 bajtów-159 Bajtów za używanie mniejszych nazw zmiennych i usuwanie białych spacji
-25 Bajtów, po wzięciu jeszcze krótszych zmiennych i dzięki poradom @KevinCruijssen
-18 Bajtów, więcej białych spacji, nazwa funkcji
-3 Bajtów, dzięki @KevinCruijssen, skracanie warunku
-5 Bajtów , Dzięki @Arnold Palmer, @KevinCruijssen, skrócenie pętli
Nie golfił
źródło
static
można je usunąć;if(n<0||n>o){return 0;}
może byćif(n<0|n>o)return 0;
(|
zamiast||
i bez nawiasów);bs
,bsa
itp. mogą być pojedynczymi znakami (nigdy nie używaj wielobajtowych nazw zmiennych / metod w golfie kodowym); Można łączyćint
s, tak:int o=2^32-2,c=0,i=x.length,l=i-1;
. Jest jeszcze kilka rzeczy do gry w golfa. Wskazówki dotyczące gry w golfa w Javie oraz wskazówki dotyczące gry we wszystkie języki mogą być interesujące do przeczytania. Jeszcze raz witamy i życzymy miłego pobytu! :)if(c[i]=='0'){j++;}
nadal można grać w golfa doif(c[i]==48)j++;
-3 bajtów :) EDYCJA: Lub jeszcze lepiej:while(j<2&&i>0){i--;if(c[i]=='0'){j++;}}
może byćfor(;j<2&i>0;j+=c[i--]==48?1:0);
do -8 bajtów.for(;j<2&i>0;j+=c[--i]==48?1:0);
powinien on działać. Błąd pochodzi zi
tego, że jest długością łańcucha, więc początkowo próbujesz indeksować poza granice tablicy. Jeśli zrobisz wstępną dekrementację (jak pokazano w zaktualizowanym fragmencie), to przy pierwszym użyciu użyje go,c[c.length-1]
podobnie jak w oryginalnym kodzie.Java (OpenJDK 8) ,
4438 bajtówWypróbuj online!
Zwraca 0, jeśli nie istnieje drugi bit zerowy.
źródło
Kod maszynowy IA-32,
1413 bajtówHexdump:
Lista demontażu:
Odbiera dane wejściowe
ecx
; wyjście jest wal
. Zwraca 0 w przypadku błędu.Przede wszystkim odwraca dane wejściowe, dzięki czemu może użyć instrukcji skanowania bitów, aby wyszukać ustawione bity. Poszukuje najmniej znaczącego zestawu bitów, resetuje go, ponownie szuka najmniej znaczącego zestawu bitów i zwraca wynik.
Jeśli instrukcja skanowania bitów nie znajdzie żadnego ustawionego bitu, dokumentacja Intela mówi, że wyjście jest niezdefiniowane. Jednak w praktyce wszystkie procesory pozostawiają w tym przypadku rejestr docelowy bez zmian (jak zauważył Cody Gray, dokumentacja AMD opisuje to zachowanie jako obowiązkowe).
Istnieją więc następujące przypadki:
not
i pozostaje 0btr
i pozostaje 0 pobsf
bsf
źródło
SALC
+DEC
jest wyjątkowo sprytny, możesz ogolić bajt, używając tylko tego, co jest wECX
drugiejBSF
instrukcji. Jedyne, co wymaga, to 1 bajt,XCHG
aby uzyskać wynik,EAX
aby mógł zostać zwrócony. Innymi słowy,not ecx; bsf eax, ecx; btr ecx, eax; bsf ecx, ecx; xchg eax, ecx; ret
ECX
jako rejestru wejściowego, musimy powiedzieć GCC, aby użyła konwencji wywoływania szybkiego połączenia.Dyalog APL, 20 bajtów
Wykorzystuje indeksowanie 1, rzuca
INDEX ERROR
w przypadku braku drugiego zera.W jaki sposób?
⍵⊤⍨
- kodować⍵
jako32⍴2
- ciąg binarny o długości 32⌽
- odwrócić~
- negacja (0 → 1, 1 → 0)(⍳32)/⍨
- kompresuj z zakresu 1-32 (pozostawiając indeksy zer)2⊃
- wybierz drugi elementźródło
⍸
)Galaretka , 13 bajtów
Wypróbuj online!
Używa indeksowania 1, jako wartość wejściową przyjmuje liczbę całkowitą bez znaku. Zwraca
0
za nie znaleziono.źródło
33
dla wejścia4294967295
(2^32-1
32-bitowy ekwiwalent bez znaku-1
)Galaretka , 12 bajtów
Łącze monadyczne, przyjmujące liczbę całkowitą, wykorzystujące opcję niepodpisaną i zwracające wynik 1-indeksowany (zwraca 0, jeśli nie istnieje).
Wypróbuj online!
lub
Spróbuj tego
W jaki sposób?
1.
2)
źródło
kod maszynowy x86_64,
3432 bajtyNie jestem pewien, czy jest to właściwe podejście, całkiem sporo bajtów (okazuje się, że tak nie jest ):
Wypróbuj online!
Dzięki @CodyGray za
-2
bajty.źródło
BSF
,BSR
,POPCNT
,BT
, itd Anatolyg został złożony rozwiązanie wzdłuż tych linii . Nie ustaliłem jeszcze, czy da się go pokonać. :-por ecx, -1
. To 3 bajty, 1 bajt krótszy niż XOR + NEG. Nie jest to dobra sztuczka, gdy nie gra się w golfa, ponieważ wprowadza zależność od fałszywego odczytu od rejestru docelowego, ale tam wystarczy użyćmov ecx, -1
i wydać 5 bajtów.8th , 149 bajtów
Skomentowany kod
Wykorzystanie i wydajność
źródło
R , 66 bajtów
czyta ze standardowego; zwroty
0
zero sekund, a miejsce inaczej.Wypróbuj online!
źródło