zainspirowany Countdown from Infinity
Biorąc pod uwagę nieujemną liczbę całkowitą N
, wypisz liczbę powtórzeń następujących kroków, aby osiągnąć 0:
- Konwertuj
N
na binarny (4812390 -> 10010010110111001100110
) - Odwróć każdy bit (
10010010110111001100110 -> 01101101001000110011001
) - Przycinanie zer wiodących (
01101101001000110011001 -> 1101101001000110011001
) - Konwertuj z powrotem na dziesiętny (
1101101001000110011001 -> 3576217
)
Zasady
- Dane wejściowe i wyjściowe mogą być w dowolnym jednoznacznym, spójnym formacie
- Dane wejściowe będą znajdować się w natywnym reprezentatywnym zakresie liczb całkowitych dla Twojego języka (jeśli Twój język obsługuje dowolnie duże liczby całkowite, nie ma żadnych ograniczeń)
Przypadki testowe
0 -> 0
1 -> 1
42 -> 6
97 -> 3
170 -> 8
255 -> 1
682 -> 10
8675309 -> 11
4812390 -> 14
178956970 -> 28
2863311530 -> 32
Ta sekwencja to A005811 w OEIS.
~(~a) == a
Odpowiedzi:
Galaretka ,
64 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
tło
Niech n będzie liczbą całkowitą nieujemną.
Kroki 2 i 3 procesu opisanego w specyfikacji można alternatywnie określić jako usunięcie wszystkich wiodących 1 i przełączenie pozostałych bitów.
Oznacza to, że usuniemy dokładnie jedną grupę sąsiednich i równych cyfr binarnych w każdej iteracji, więc Binary Countdown Length n to tylko liczba tych grup w binarnej reprezentacji n . Na potrzeby tego wyzwania pomyśl o 0 jako bez cyfr.
Dla n = 8675309 proces wygląda binarnie w następujący sposób.
Zamiast zliczać te grupy (co mogłoby się nie powieść w przypadku 0 krawędzi ), wykonujemy następujące czynności.
n i n: 2 mają następujące reprezentacje binarne.
Zauważ, że binarna reprezentacja n: 2 to po prostu n , przesunięta o jeden bit w lewo.
Jeśli XOR n i n: 2 , otrzymamy 1 (MSB) i dodatkowy 1 dla każdej pary różnych sąsiadujących cyfr. Liczba grup jest więc równa liczbie ustawionych bitów w n ⊻ n: 2 .
Jak to działa
źródło
Python 2, 30 bajtów
Przetestuj na Ideone .
tło
Niech n będzie liczbą całkowitą nieujemną.
Kroki 2 i 3 procesu opisanego w specyfikacji można alternatywnie określić jako usunięcie wszystkich wiodących 1 i przełączenie pozostałych bitów.
Oznacza to, że usuniemy dokładnie jedną grupę sąsiednich i równych cyfr binarnych w każdej iteracji, więc Binary Countdown Length n to tylko liczba tych grup w binarnej reprezentacji n . Na potrzeby tego wyzwania pomyśl o 0 jako bez cyfr.
Dla n = 8675309 proces wygląda binarnie w następujący sposób.
Zamiast zliczać te grupy (co mogłoby się nie powieść w przypadku 0 krawędzi ), wykonujemy następujące czynności.
n i n: 2 mają następujące reprezentacje binarne.
Zauważ, że binarna reprezentacja n: 2 to po prostu n , przesunięta o jeden bit w lewo.
Jeśli XOR n i n: 2 , otrzymamy 1 (MSB) i dodatkowy 1 dla każdej pary różnych sąsiadujących cyfr. Liczba grup jest więc równa liczbie ustawionych bitów w n ⊻ n: 2 .
źródło
Python 2, 29 bajtów
Liczy liczbę zmian między 0 a 1 w rozwinięciu binarnym, licząc wiodącą 1 jako alternatywę. Czyni to, sprawdzając, czy dwie ostatnie cyfry binarne są różne, a następnie powraca do liczby z usuniętą ostatnią cyfrą. Dwie ostatnie cyfry są różne dokładnie, jeśli
n%4
wynosi 1 lub 2, co można sprawdzić jako-n%4/2
.źródło
JavaScript (ES6), 26 bajtów
Działa poprzez zliczanie przejść od 0 do 1. Działa tylko do 31 bitów. 29 bajtów do obsługi 53 bitów:
źródło
Haskell, 34 bajty
źródło
05AB1E ,
75 bajtówZaoszczędzono 2 bajty dzięki Dennisowi .
Bez przypadku krawędzi 0 może to być 3 bajty
bÔg
.Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
CJam , 14 bajtów
Wypróbuj online!
Zasadniczo podróbka mojej odpowiedzi na drugie pytanie.
źródło
Java 7,
112 108 100 9073 bajtyPodstawowy pomysł
źródło
j=j/2
można skrócić doj/=2
. Poza tym świetna odpowiedź!int c(int i){return i>0?((i^(i>>=1))%2+c(i):0;}
( 47 bajtów ). Nadal pozostawiłbym również twoją obecną odpowiedź, ponieważ jest bardziej oryginalna, a porty innych użytkowników są całkowitym przeciwieństwem oryginału. :)J, 14 bajtów
Liczy liczbę przebiegów w cyfrach binarnych n ze specjalnym przypadkiem zwracającym 0 dla n = 0.
Stosowanie
Wyjaśnienie
źródło
CJam ,
1110 bajtówDzięki @Dennis za uratowanie jednego bajtu!
Wypróbuj online!
Wyjaśnienie
źródło
e&
(logiczne AND) oszczędza bajt\g*
.Rakieta 349 bajtów
Nie golfowany:
Testowanie:
Wynik:
źródło
tl
iib
na 1-bajtowe nazwy.MATL , 7 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Vim,
6259 bajtów-3 bajty dzięki DJMcMayhem
Oto wyjście xxd z nienaruszonymi znakami niedrukowalnymi:
Wypróbuj online!
Wyjaśnienie
źródło
:s/^0*
jest o jeden bajt krótszy niż:s/^0\+
i, gdy jesteś w rejestrze „eval”, możesz po prostu zrobićpr<S-tab>'%b',<C-r>")
autouzupełnianie. (Zapisuje 4 bajty):s/^0*
ponieważ pasuje do pustej linii i potrzebuję, aby zakończyła się niepowodzeniem, opróżniając pustą linię, aby uciec od rekurencyjnego makra.Rubinowy, 26 bajtów
Zainspirowany odpowiedzią Python na xnor.
źródło
PHP, 64 bajty
na podstawie mojego rozwiązania odliczania
wypisuje czasy
1
znakówk
, gdziek
jest liczba iteracji.+4 bajty dla wyjścia liczb całkowitych: (puste wyjście dla
0
)źródło
JavaScript (ES6), 44
Funkcja rekurencyjna
Ograniczona do dodatniej liczby całkowitej javascript, 31 bitów:
Zarządzanie podwójną precyzją do 53 znaczących bitów - 59 bajtów:
Innym sposobem: użycie niesamowitego algorytmu @Dennis, nierekurencyjna funkcja zarządzająca 53 bitami, 43 bajtami:
źródło
PHP, 51 bajtów
Używa wyrażenia regularnego, aby policzyć liczbę przebiegów wynoszącą 1 lub 0. Niestety wymaga to specjalnego przypadku, dla którego wprowadzenie
0
wymaga 3 dodatkowych bajtów (i powiadamia).źródło
o
aby uniknąć powiadomienia. b) Możesz zapisać 3 bajty z-F
flagą i$argn
zamiast$argv[1]
. c)/1+|0+/
powinno wystarczyć do wyrażenia regularnego.Java 7, 71 bajtów
int b(Long a){return a==0?0:1+b(~a&-1L>>>64-a.toString(a,2).length());}
Wiem, że pokonało to rozwiązanie Geobits
split
(które ostatecznie zostanie opublikowane), ale pisanie tego było fajneźródło
Oktawa, 47 bajtów
Zgodnie z wpisem OEIS, wartość, której szukamy jako rozwiązania tego wyzwania, jest również równa liczbie
1
s w kodzie Graya dla danej liczby całkowitej.Wikipedia mówi mi, że kod Graya można obliczyć jako x ^ (x >> 1), więc w powyższej funkcji obliczyłem kod Graya jako taki, przekonwertowałem go na ciąg binarny i policzę ile cyfr tego ciągu
1
.źródło
Java 7, 64 bajty
Wiem, że może to zostać pobity przez port jednej z lepszych odpowiedzi, ale wymyśliłem to na czacie i nie mogę tego nie opublikować po tym, jak Poke powiedział coś na ten temat :)
źródło
C, 76 bajtów
Działa dla wszystkich przypadków testowych (o ile nie chcę dołączać słowa unsigned lub last case test) ...
źródło
Bash, 57 bajtów
Pakiety: Core Utililities, grep, sed, vim (for
xxd
)Załóżmy, że liczba jest podana w formacie binarnym. Każda długość jest dopuszczalna :)
źródło
Perl 5 , 31 + 1 (
p
) = 32 bajtyWypróbuj online!
Korzystanie z metody @ Dennisa.
źródło
Tcl , 119 bajtów
Wypróbuj online!
Wciąż bardzo niepodobna do mojego gustu
źródło