Dodatnią liczbę całkowitą można rozcieńczyć , wstawiając 0
między dwa bity w jej rozwinięciu binarnym. Oznacza to, że n
liczba -bitowa ma n-1
rozcieńczenia, które niekoniecznie wszystkie są różne.
Na przykład dla 12
(lub 1100
binarnie) rozcieńczenia są
11000 = 24
^
11000 = 24
^
10100 = 20
^
W tym wyzwaniu weźmiemy sumę wszystkich rozcieńczeń, z wyjątkiem oryginalnej liczby. Ponieważ 12
, biorąc sumę 24, 24, 20
wyników 68
, 68
powinna być również wynikiem dla 12
.
Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą n > 1
jako dane wejściowe, wyślij / zwróć rozcieńczoną sumę, jak wyjaśniono powyżej.
Przykłady
in out
--- ---
2 4
3 5
7 24
12 68
333 5128
512 9216
Zasady
- Można założyć, że dane wejściowe i wyjściowe pasują do natywnego typu liczb całkowitych twojego języka.
- Dane wejściowe i wyjściowe można podawać w dowolnym dogodnym formacie .
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je wydrukować.
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
code-golf
arithmetic
number-theory
binary
AdmBorkBork
źródło
źródło
Odpowiedzi:
Python 2 ,
4339 bajtówWypróbuj online!
W jaki sposób?
Każde wywołanie funkcji rekurencyjnej oblicza pojedyncze rozcieńczenie. Pozycja wstawionego
0
tolog2(i)
. Funkcja powtarza się, ażi
stanie się większa niż,n
a wstawianie będzie po lewej stronie liczby. Jeślii>n
,n/i
ocenia na0
, co jest wartością falsy w Pythonie.n*2
przesuwa całą cyfrę binarną numer jeden w lewon%i
lubn % 2**(position of insertion)
oblicza wartość części, której nie należy przesuwać w lewo. Ta wartość jest odejmowana od przesuniętej liczby.Przykład (n = 7)
źródło
Galaretka , 11 bajtów
Wypróbuj online!
Jak to działa
źródło
MATL , 13 bajtów
Wypróbuj w MATL Online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Rozważ dane wejściowe
12
jako przykład.źródło
C,
5856 bajtówDzięki @Dennis za uratowanie dwóch bajtów!
Wypróbuj online!
C (gcc) , 50 bajtów
Powrót przez
k=s;
jest niezdefiniowanym zachowaniem, ale działa z gcc, gdy optymalizacje są wyłączone. Ponadton%k+n/k*(k+=k)
ma nieokreślone zachowanie , ale wydaje się działać dobrze z gcc.Wypróbuj online!
źródło
s,k;f(n){for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;}
(55 bajtów)n%k
lubn/k*(k*=2)
.for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;
jest całkowicie w porządku in%k
zawsze będzie oceniany przed,n/k*(k*=2)
an/k
także oceni przedk*=2
. Dziękuję za wyjaśnienie. (Galaretka ,
98 bajtówWypróbuj online!
Odwrotnie
B¹ƤṖ+BḄS
: pobierz prefiksy, upuść ostatni, dodaj je do danych wejściowych i zsumuj.źródło
J ,
20 1514 bajtówWypróbuj online.
15 bajtów
Wypróbuj online!
źródło
Japt ,
1211 bajtówSpróbuj
Wyjaśnienie
źródło
JavaScript (ES6),
4140 bajtówZapisano 1 bajt dzięki Mr.Xcoder
Przypadki testowe
Pokaż fragment kodu
źródło
Siatkówka ,
535047 bajtówWypróbuj online! Link zawiera przypadki testowe. Edycja: Zapisano 3 bajty dzięki @MartinEnder. Wyjaśnienie:
Konwertuj z dziesiętnego na dwójkowy, ale używając O do reprezentowania 0, ponieważ nie jest to cyfra, i _ do reprezentowania 1, ponieważ jest to domyślny znak powtórzenia w Retina 1.
Wstaw literę O między każdą parą cyfr i zbierz wyniki jako listę.
Konwertuj z binarnego na jednoargumentowy. (Ta konwersja generuje dodatkowe
O
s, ale nas to nie obchodzi.)Suma i przeliczenie na dziesiętne.
źródło
%
. Jeśli jest to bardziej skomplikowane, potrzebujesz czegoś takiego/[O_]+/_
.Pyth , 13 bajtów
Wypróbuj tutaj!
Wyjaśnienie
źródło
Galaretka , 10 bajtów
Wypróbuj online!
Obecnie nie najkrótszy, ale może być, jeśli istnieje sposób na obejście
Bµ µḄ
...Wyjaśnienie
Zasadniczo działa to poprzez pomnożenie każdej cyfry binarnej przez liczbę magiczną. Nie potrafię tego wyjaśnić bez wizualizacji, więc oto liczba binarna, z którą będziemy pracować:
Jak wyjaśniono w wyzwaniu, chcemy, aby wynik był sumą tych liczb binarnych:
Jednak tak naprawdę nie musimy wstawiać zer: „niebinarny” atom galaretki akceptuje liczby inne niż tylko
0
i1
. Gdy pozwolimy sobie na użycie2
, ten wzór staje się prostszy:Po zsumowaniu cyfr w każdej kolumnie otrzymujemy
Trik zastosowany w tej odpowiedzi polega na wygenerowaniu tego wzoru i pomnożeniu każdej cyfry przez odpowiednią cyfrę w oryginale, aby skasować niezbędne kolumny. 12, na przykład, byłoby reprezentowane jako
źródło
Java 8, 55 bajtów
Port odpowiedzi Steadyboksa C i grał w golfa 3 bajty.
Wypróbuj online.
źródło
Łuska ,
1312 bajtów-1 bajt dzięki @Mr. Xcoder!
Wypróbuj online!
Wyjaśnienie
źródło
05AB1E , 14 bajtów
Wypróbuj online!
źródło
Pip ,
2118 bajtówWypróbuj online!
Wyjaśnienie
Zadzwoń na nasz numer wejściowy
a
. Dla każdego indeksu binarnego,i
przy którym chcemy wstawić zero, możemy obliczyć bity po lewej stronie punktu wstawiania jakoa // 2**i
(gdzie//
jest dzielenie całkowite i**
wykładnik), bity po prawej stronie punktu wstawienia jakoa % 2**i
, a zatem rozcieńczoną liczbę całkowitą jako2 * (a // 2**i) * 2**i + (a % 2**i)
. Ale(a // 2**i) * 2**i
jest równaa - (a % 2**i)
, a więc możemy zmienić na krótszą formułę:2 * (a - a % 2**i) + a % 2**i
=2 * a - a % 2**i
.źródło
R ,
14148 bajtówWypróbuj online!
Albo robię coś naprawdę złego, albo R jest po prostu okropnie manipulowany.Podejście do portowania Luisa Mendo jest łatwe, poprawne i gra w golfa.Ale jeśli naprawdę chcesz po prostu wygrać z operacjami bitowymi, MickyT zasugerował następujące 105 bajtów:
Wypróbuj online!
źródło
Python 3,
928078 bajtówWypróbuj online
Dzięki Mr.XCoder i ovs odpowiednio dla -12 bajtów i -2 bajtów.
źródło
Partia,
9277 bajtówEdycja: Przełączono na tę samą formułę, której używają wszyscy inni.
źródło
Galaretka , 14 bajtów
Wypróbuj online!
źródło
Perl 5 , 36 + 1 (
-p
) = 37 bajtówWypróbuj online!
źródło
Attache , 57 bajtów
Wypróbuj online!
Myślałem, że podchodzę do problemu z nie-bitowej manipulacji, ponieważ takie podejście jest niepraktyczne w Attache. Muszę zbadać niektóre części tego podejścia w odniesieniu do alternatyw.
Wyjaśnienie
Oto rozszerzona wersja:
To po prostu bierze binarną reprezentację liczby, dzieli ją w określonych punktach, wstawia tam zera, konwertuje z powrotem na dziesiętne i sumuje je razem.
źródło
J , 33 bajty
Najprawdopodobniej jest dużo miejsca na dalszą grę w golfa.
W jaki sposób?
@#:
przekonwertować na binarny i<@}.\.
- znajdź wszystkie wystarczające, upuść pierwszą cyfrę z każdego i pola<\
- znajdź wszystkie prefiksy i zapakuj je(,0;])"0
- do każdego prefiksu dołącz 0, a następnie dołącz odpowiedni sufiks ścięty;@
Raze (rozpakuj)1#.[:}:#.@
- konwertuj na dziesiętne, skracaj i sumujWypróbuj online!
źródło