Starożytni Grecy nazywali te rzeczy pojedynczo i podwójnie parzystymi liczbami. Przykładem pojedynczo parzystej liczby jest 14. Można ją podzielić przez 2 raz, i w tym momencie stała się liczbą nieparzystą (7), po czym nie jest już podzielna przez 2. Podwójnie parzysta liczba to 20. Można ją dwukrotnie podzielić przez 2, a następnie otrzymać 5.
Twoim zadaniem jest napisanie funkcji lub programu, który pobiera liczbę całkowitą jako dane wejściowe i wyprowadza liczbę podzielności przez 2 jako liczbę całkowitą, w jak najmniejszej liczbie bajtów. Dane wejściowe będą niezerową liczbą całkowitą (dowolną wartością dodatnią lub ujemną, w granicach twojego języka).
Przypadki testowe:
14 -> 1
20 -> 2
94208 -> 12
7 -> 0
-4 -> 2
Odpowiedź z najmniej bajtami wygrywa.
Wskazówka: Spróbuj przekonwertować liczbę na bazę 2. Zobacz, co ci to mówi.
The input will be a nonzero integer
Czy należy to zmienić po komentarzu na temat tego, że zero jest potencjalnym wkładem?Odpowiedzi:
Galaretka , 4 bajty
W najnowszej wersji Jelly
ÆEḢ
działa (3 bajty).Wypróbuj tutaj .
źródło
kod maszynowy x86_64, 4 bajty
Dokładnie to robi instrukcja BSF (przeskok bitów do przodu) !
W zespole w stylu gcc jest to:
Dane wejściowe są podawane w rejestrze EDI i zwracane w rejestrze EAX zgodnie ze standardowymi 64-bitowymi konwencjami wywoływania c .
Ze względu na kodowanie binarne z dopełnieniem dwóch działa to zarówno dla liczb -ve, jak i + ve.
Ponadto, pomimo dokumentacji mówiącej: „Jeśli treść operandu źródłowego wynosi 0, treść operandu docelowego jest niezdefiniowana”. , Znajduję na mojej maszynie Wirtualnej Ubuntu, że wynikiem
f(0)
jest 0.Instrukcje:
evenness.s
i zmontujgcc -c evenness.s -o evenness.o
evenness-main.c
i skompiluj zgcc -c evenness-main.c -o evenness-main.o
:Następnie:
gcc evenness-main.o evenness.o -o evenness
./evenness
@FarazMasroor poprosił o więcej informacji na temat sposobu uzyskania tej odpowiedzi.
Jestem bardziej zaznajomiony z c niż zawiłościami zestawu x86, więc zazwyczaj używam kompilatora do generowania kodu zestawu dla mnie. Wiem z doświadczenia, że rozszerzenia takie jak gcc
__builtin_ffs()
,__builtin_ctz()
i__builtin_popcount()
zazwyczaj skompilować i zmontować do 1 lub 2 instrukcje x86. Zacząłem więc od funkcji c, takiej jak:Zamiast używać zwykłej kompilacji gcc aż do kodu obiektowego, możesz użyć
-S
opcji kompilacji tylko do złożenia -gcc -S -c evenness.c
. To daje plik asembleraevenness.s
taki jak ten:Wiele z tego można zagrać w golfa. W szczególności wiemy, że konwencja wywoływania c dla funkcji z podpisem jest ładna i prosta - parametr wejściowy jest przekazywany do rejestru, a zwracana wartość jest zwracana do rejestru. Możemy więc wyciągnąć większość instrukcji - wiele z nich dotyczy zapisywania rejestrów i konfigurowania nowej ramki stosu. Nie używamy tutaj stosu i używamy tylko rejestru, więc nie musisz się martwić o inne rejestry. Pozostawia to kod zestawu „golfowy”:
int f(int n);
EDI
EAX
EAX
Uwaga: jak wskazuje @zwol, można również użyć zoptymalizowanej kompilacji, aby osiągnąć podobny wynik. W szczególności
-Os
tworzy dokładnie powyższe instrukcje (z kilkoma dodatkowymi dyrektywami asemblera, które nie generują żadnego dodatkowego kodu obiektowego).Jest to teraz zmontowane z
gcc -c evenness.s -o evenness.o
, które można następnie połączyć z programem sterownika testowego, jak opisano powyżej.Istnieje kilka sposobów ustalenia kodu maszynowego odpowiadającego temu zespołowi. Moim ulubionym jest użycie
disass
polecenia dezasemblacji gdb :Widzimy więc, że kod maszynowy
bsf
instrukcji jest0f bc c7
iret
jestc3
.źródło
evenness-main.c
z różnymi ustawieniami optymalizacji; dla mnie to zrywa z-O
,-O2
lub-O3
.Python, 25 bajtów
n & -n
zeruje cokolwiek oprócz najmniej znaczącego bitu, np. to:Interesuje nas liczba końcowych zer, więc konwertujemy ją na ciąg binarny za pomocą
bin
, który dla powyższej liczby będzie"0b10000"
. Ponieważ nie dbamy o0b
ani, ani1
odejmujemy 3 od tej długości łańcuchów.źródło
Pyth, 6 bajtów
Wypróbuj tutaj .
źródło
JavaScript (ES6), 18 bajtów
4 bajty krótsze niż
31-Math.clz32
. Hahźródło
Math.clz32
...JavaScript ES6,
2219 bajtówWygląda na to, że rekursja jest najkrótszą trasą.
źródło
Pyth, 8 bajtów
Na przykład binarna reprezentacja
94208
to:Po podzieleniu na
1
si i zabraniu ostatniego elementu wynikowej tablicy staje się:To 12 zer, więc to „12-ly nawet”.
Działa
x / 2
to, ponieważ jest zasadniczox >> 1
- czyli przesunięciem bitów w prawo1
. Dlatego liczba jest podzielna przez 2 tylko wtedy, gdy LSB jest0
(tak jak liczba dziesiętna jest podzielna przez 10, gdy jej ostatnia cyfra jest0
).źródło
05AB1E ,
45 bajtówTeraz obsługuje liczby ujemne. Kod:
Wypróbuj online!
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252.
źródło
Pyth, 6 bajtów
Zasadniczo po prostu
źródło
MATL , 5 bajtów
Działa to dla wszystkich liczb całkowitych.
Wypróbuj online!
źródło
C, 36 (28) bajtów
(Podano brak testowania na argument zerowy jako argument niezerowy).
Aktualizacja (w odpowiedzi na komentarz) : Jeśli zezwolimy na deklaracje funkcji stylu K&R, możemy mieć wersję 28-bajtową:
W tym przypadku możemy liczyć na to, że zarówno kompilator domyślnie
n
i rodzaju powrótf
doint
. Ten formularz generuje ostrzeżenie z C99 i nie kompiluje się jako poprawny kod C ++.źródło
int n
->n
nadal jest to poprawny kod C i odcina 4 znaki.Java 7, 39 lub może 44 bajty
Tak, rekurencja! Musiałem użyć
!=
zamiast krótszego porównania, aby nie przepełnić negatywnych danych wejściowych, ale poza tym jest to dość proste. Jeśli to dziwne, wyślij zero. Jeśli nawet, dodaj jeden i zrób to jeszcze raz.Istnieją dwie wersje, ponieważ obecnie dane wyjściowe dla zera są nieznane. Pierwszy będzie powtarzał się, aż stos się przepełni, i nic nie wyprowadza, ponieważ 0 jest nieskończenie równe. Drugi wyrzuca ładne, bezpieczne, ale prawdopodobnie nie matematyczne rygorystyczne 0 dla wyjścia.
źródło
JavaScript (ES6),
20 bajtów19 bajtów.To jest port rozwiązania Haskell od @nimi do JavaScript. Wykorzystuje właściwości „zwarcia”,
&&
które zwraca jego lewą stronę, jeśli jest falsey (co w tym przypadku jest-0
), lub zwraca prawą stronę. Aby wdrożyćodd x = 0
, wykonujemy zatem lewą stronę,1 - (x % 2)
która0
przepuszcza bąbelki&&
, w przeciwnym razie uciekamy się1 + f(x / 2)
.Golenie
1 - (x % 2)
as(~x) % 2
wynika z poniższej @Neil i ma dziwną właściwość, która powoduje, że powyższa funkcja emituje-0
małe liczby nieparzyste. Ta wartość jest osobliwością decyzji JS, że liczby całkowite są podwójnymi liczbami IEEE754; ten system ma osobne+0
i-0
są w JavaScripcie specjalnie zaprojektowane, aby być===
ze sobą.~
Operatora oblicza 32-bitowe, zalogowanych całkowitą bitową inwersję na liczbę, która dla małych liczb nieparzystych będzie ujemny liczba parzysta. (NaMath.pow(2, 31) + 1
przykład liczba dodatnia daje0
raczej niż-0
.) Dziwne ograniczenie liczb całkowitych ze znakiem 32-bitowym nie ma żadnych innych efektów; w szczególności nie wpływa to na poprawność.źródło
~x&1
jest bajtem krótszym niż1-x%2
.Perl 6,
2318 bajtówstosowanie
źródło
Ruby 24 bajty
Moje pierwsze zgłoszenie do gry w golfa (tak!)
Jak się tu dostałem :
Najpierw chciałem uzyskać kod, który faktycznie spełniał specyfikację, aby rozwiązać problem, więc zbudowałem metodę bez względu na liczbę bajtów:
z tą wiedzą przekreśliłem funkcję w pętlę while i dodałem
$*
(ARGV) jako dane wejściowe i jako liczbę, ile razy liczba została zmniejszona o połowę, zanim stała się nieparzysta.Byłem z tego dość dumny i prawie przedłożyłem to, zanim dotarło do mnie, że to wszystko podzielone przez dwa brzmiało dla mnie trochę dwójkowo, będąc inżynierem oprogramowania, ale nie tyle informatykiem, co nie przychodzi mi na myśl.
Zebrałem więc wyniki dotyczące tego, jak wyglądały wartości wejściowe w formacie binarnym:
Zauważyłem, że wynikiem była liczba pozycji w lewo, którą musimy przejść, zanim liczba stanie się nieparzysta.
Wykonując proste operacje na łańcuchach, podzieliłem łańcuch przy ostatnim wystąpieniu 1 i policzyłem długość pozostałych zer:
używając
("%b" % x)
formatowania, aby zamienić liczbę na binarną, i String # slice, aby pokroić mój ciąg.Nauczyłem się kilku rzeczy o ruby w tym zadaniu i już wkrótce czekam na więcej golfów!
źródło
@wizzwizz4
na początku komentarza, aby mi odpowiedzieć. (Działa to ze wszystkimiJ, 6 bajtów
Wyjaśnienie:
źródło
C, 37 bajtów
f(int x){return x?x&1?0:1+f(x/2):0;}
Rekurencyjnie sprawdź ostatni bit, aż nie będzie to 0.źródło
f(int n){return __builtin_ctz(n);}
jeśli chcesz używać rozszerzeń gcc. Lub nawet#define f __builtin_ctz
int
. Jest niejawny, podobnie jak typ zwrotu.f(n){...}
? GCC tego nie skompiluje. Nie jestem ekspertem od C, ale szybkie wyszukiwanie ujawnia, że być może ta funkcja została usunięta w nowszych wersjach C. Więc może skompiluje się z odpowiednimi flagami?-ansi
albo-gnu99
? Wiem, że udało mi się to uruchomić. Napisałem o tym odpowiedź na wskazówki!Haskell, 28 bajtów
Przykład użycia:
f 94208
->12
.Jeśli liczba jest nieparzysta, wynik jest
0
inny,1
plus połączenie rekurencyjne z połową numeru.źródło
div x 2
? Dlaczego niex/2
?div
to dzielenie całkowite, dzielenie/
zmiennoprzecinkowe.Befunge, 20
Wykonanie kodu przesuwa się w prawo i zawija do drugiego znaku pierwszego wiersza (dzięki końcowemu
#
) aż do2%
wyjścia1
, co powoduje_
zmianę kierunku w lewo, a następnie|
w górę, co powoduje zawijanie do<
drugiego wiersza, które wyjścia i wyjścia. Za każdym razem przez pętlę zwiększamy drugi element stosu za każdym razem, a następnie dzielimy górę przez 2.źródło
Siatkówka ,
2917Wypróbuj online!
2 bajty zapisane dzięki Martinowi!
Zajmuje jednoargumentowy wkład. Powoduje to wielokrotne dopasowanie największej możliwej liczby
1
s, tak że ta liczba1
s pasuje dokładnie do reszty1
s podanej liczby. Za każdym razem, gdy to robi,;
dodaje ciąg do ciągu. Na koniec zliczamy liczbę;
s w ciągu.Aby wprowadzić dane dziesiętne, dodaj:
do początku programu.
źródło
Jolf, 6 bajtów
Wypróbuj tutaj!
Raczej proste ... Uznanie dla ETHProdukty za wyparcie Jolfa z wersją, która naprawdę powinna działać!
źródło
PARI / GP, 17 bajtów
źródło
6502 język maszynowy, 7 bajtów
Aby znaleźć wartość miejsca najmniej znaczącego 1 bitu niezerowej wartości w akumulatorze, pozostawiając wynik w rejestrze X:
Aby uruchomić to na symulatorze 6502 na e-tradition.net , należy poprzedzić go znakiem , a
A9
następnie 8-bitową liczbą całkowitą.To rozkłada się na następujące:
Jest to równoważne z następującym C, z tym wyjątkiem, że C musi
int
mieć co najmniej 16 bitów:To samo działa na 65816, przy założeniu, że MX = 01 (akumulator 16-bitowy, indeks 8-bitowy) i jest równoważne powyższemu fragmentowi C.
źródło
Brachylog ,
2715 bajtówWyjaśnienie
źródło
CJam, 8 bajtów
Czytaj liczbę całkowitą, wartość bezwzględną, rozkład na czynniki pierwsze, policz dwa.
źródło
JavaScript ES6, 36
38bajtówGrał w golfa dwa bajty dzięki produktom @ETH
Odpowiedź dość nudna, ale działa. Może być zbyt podobny do innej odpowiedzi, jeśli doda sugerowane zmiany, usunę moją.
Aby uruchomić, przypisz ją do zmiennej (
a=>{for...
), ponieważ jest to funkcja anonimowa, a następnie wywołaj ją za pomocąa(100)
.źródło
b%2==0
można zmienić nab%2-1
ic++
można go przenieść w ostatniej częścifor
instrukcji. Myślę, że to też zadziała:b=>eval("for(c=0;b%2-1;b/=2)++c")
b%2-1
=>~b&1
Myślę też, że to się nie powiedzie na wejściu0
, co można naprawić za pomocąb&&~b&1
b%2-1
sprawdzenie nie powiedzie się w przypadku ujemnych liczb nieparzystych.ES6, 22 bajty
Zwraca -1, jeśli zdasz 0.
źródło
DUP , 20 bajtów
Try it here!
Przekształcony w rekurencję, wyjście jest teraz najwyższym numerem na stosie. Stosowanie:
Wyjaśnienie
źródło
Japt,
95 bajtówPrzetestuj online!
Poprzednia wersja powinna mieć pięć bajtów, ale ta faktycznie działa.
Jak to działa
źródło
C,
444038 36 bajtów2 bajty wyłączone dzięki @JohnWHSmith . 2 bajty wyłączone dzięki @luserdroog .
Testuj na żywo na ideone .
źródło
!(n%2)
małe~n&1
.=0
. Globały są domyślnie inicjowane na 0.a
, czy nie gwarantuje się, że zadziała tylko przy pierwszym wywołaniu? Nie wiedziałem, że to dozwolone.