tło
W matematyce dobrze wiadomo, że liczby całkowite można umieszczać w korespondencji jeden-do-jednego z parami liczb całkowitych. Można to zrobić na wiele sposobów, aw tym wyzwaniu zaimplementujesz jeden z nich i jego odwrotne działanie.
Zadanie
Twój wkład jest dodatnią liczbą całkowitą n > 0
. Wiadomo, że istnieją unikalne nieujemne liczby całkowite, a, b ≥ 0
takie jak . Twój wynik to „odwrócona wersja” dodatniej liczby całkowitej .n == 2a * (2*b + 1)
n
2b * (2*a + 1)
Możesz założyć, że dane wejściowe i wyjściowe pasują do standardowego typu danych całkowitych bez znaku w Twoim języku.
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
Są one podane w formacie in <-> out
, ponieważ funkcja, która ma zostać zaimplementowana, jest odwrotna: jeśli podasz z powrotem dane wyjściowe, powinieneś otrzymać oryginalne dane wejściowe.
1 <-> 1
2 <-> 3
4 <-> 5
6 <-> 6
7 <-> 8
9 <-> 16
10 <-> 12
11 <-> 32
13 <-> 64
14 <-> 24
15 <-> 128
17 <-> 256
18 <-> 48
19 <-> 512
20 <-> 20
28 <-> 40
30 <-> 384
56 <-> 56
88 <-> 224
89 <-> 17592186044416
Tabela liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka. Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz dołączyć wiele numerów do nagłówka (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że faktyczny wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
źródło
Odpowiedzi:
Galaretka ,
171615 bajtówWypróbuj online!
Jak to działa
źródło
Pyth,
1615 bajtów1 bajt dzięki Dennisowi
Zestaw testowy
Wyjaśnienie:
źródło
MATL , 22 bajty
Wypróbuj online!
Wyjaśnienie
źródło
Q
dla1+
(zostało to niedawno wprowadzone) iq
dla1-
. To także oszczędza miejsce (które i tak można zaoszczędzićH
). Zobacz tutajPython 2, 39 bajtów
n & -n
daje największą siłę 2, która dzielin
. To działa, ponieważ w uzupełnionych do dwóch arytmetyka-n == ~n + 1
. Jeślin
ma k końcowych zer, pobranie jego dopełnienia spowoduje, że będzie mieć k zer zerowych . Następnie dodanie 1 zmieni wszystkie końcowe zera na zera i zmieni bit 2 ^ k z 0 na 1. Więc-n
kończy się na 1, po którym następuje k 0 (podobnie jakn
), mając jednocześnie przeciwny bitn
we wszystkich wyższych miejscach.źródło
n&-n
działa? widzę, co robi ta sztuczka, ale nie jak :(n&-n
zwraca najwyższą potęgę z 2, które dzieląn
.n & -n
.n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100
, ale są dwa znaki za najlepszym rozwiązaniem.n
.MATL , 25
26bajtówUżywa bieżącej wersji (10.2.1) języka / kompilatora.
Wypróbuj online!
Wyjaśnienie
Całkiem proste, oparte na brutalnej sile. Próbuje wszystkich kombinacji a i b , wybiera odpowiednią i wykonuje wymagane obliczenia.
źródło
Julia, 41 bajtów
Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca liczbę całkowitą. Aby go wywołać, przypisz go do zmiennej.
Definiujemy
a
jako 1 + wykładnik 2 w pierwotnym rozkładzie na czynnikin
. Odfactor
ZwracaDict
możemy korzystaćget
z domyślnej wartości 0 w przypadku głównym faktoryzacji nie zawiera 2. We właściwej bitowego przesunięcian
przeza
i Take 2 do tej mocy. Pomnożymy to,2a-1
aby uzyskać wynik.źródło
Perl 5, 40 bajtów
38 bajtów plus 2 dla
-p
-p
wczytuje STDIN do zmiennej$_
.$i++,$_/=2until$_%2
inkrementuje$i
(który zaczyna się od 0) i zmniejsza o połowę,$_
aż$_
będzie niezerowy mod 2. Następnie$_
jest nieparzystym współczynnikiem oryginalnej liczby i$i
jest wykładnikiem 2.$_=2*$i+1<<$_/2-.5
- Prawa strona=
to tylko wzór na szukaną liczbę: {1 ponad dwukrotność wykładnika 2} razy {2 do potęgi {połowa nieparzystego czynnika minus pół}}. Ale „czasy {2 do potęgi…}” są golfowane jako „przesunięte nieco w lewo o…”. I ta prawa strona jest przypisana$_
.I
-p
druki$_
.źródło
C, 49 bajtów
źródło
JavaScript ES6,
3633 bajtówRozumiem, że
Math.clz32
będzie to krótsze niż bawienie siętoString(2).length
.Edycja: Zapisano 3 bajty dzięki @ user81655.
źródło
n&-n
zmienną:n=>63-2*Math.clz32(x=n&-n)<<n/x/2
n&=-n
, ale potrzebujęn
ponownie ...PARI / GP , 38 bajtów
Należy pamiętać, że
>>
i\
mają ten sam priorytet i są obliczane od lewej do prawej, tak ostatnia część może byćn>>k\2
zamiast(n>>k)\2
. Wersja bez golfa uczyniłabyk
leksykalną zmy
:źródło