Wprowadzenie
To wyzwanie wymaga ustawienia zer końcowych reprezentacji binarnej liczb całkowitych na 010101…
, najlepiej to wyjaśnić na przykładzie:
Biorąc pod uwagę liczbę całkowitą 400
, pierwszym krokiem jest konwersja do postaci binarnej:
110010000
Jak widzimy, piąty bit jest najmniej znaczący 1
, więc zaczynając od tego, zamieniamy dolne zera na 0101
:
110010101
Na koniec konwertujemy to z powrotem na dziesiętne: 405
Wyzwanie
Biorąc pod uwagę dodatni zwrot / wyjście liczb całkowitych, odpowiednią wynikową wartość wyżej zdefiniowanego procesu.
Zasady
- Ta sekwencja jest zdefiniowana tylko dla liczb całkowitych z co najmniej jednym
1
bitem, więc wejście zawsze będzie ≥ 1 - Zamiast tego możesz traktować dane wejściowe jako ciąg znaków, listę cyfr (dziesiętną)
- Nie musisz obsługiwać nieprawidłowych danych wejściowych
Przypadki testowe
Oto kilka przypadków testowych z krokami pośrednimi (nie musisz ich drukować / zwracać):
In -> … -> … -> Out
1 -> 1 -> 1 -> 1
2 -> 10 -> 10 -> 2
3 -> 11 -> 11 -> 3
4 -> 100 -> 101 -> 5
24 -> 11000 -> 11010 -> 26
29 -> 11101 -> 11101 -> 29
32 -> 100000 -> 101010 -> 42
192 -> 11000000 -> 11010101 -> 213
400 -> 110010000 -> 110010101 -> 405
298 -> 100101010 -> 100101010 -> 298
n
maksymalna moc 2 dzieląca dane wejściowe, to odpowiedź jest prosta(input) + ceil((2^n - 2)/3)
Odpowiedzi:
Python 3 , 20 bajtów
Wypróbuj online!
Wyjaśnienie
Weź
192
jako przykład. Jego forma binarna jest11000000
i musimy ją przekonwertować11010101
.Zauważamy, że musimy dodać
10101
do numeru. Jest to seria geometryczna (4^0 + 4^1 + 4^2
), która ma postać zamkniętą jako(4^3-1)/(4-1)
. Jest to to samo, co4^3//3
gdzie//
oznacza podział na liczby całkowite.Gdyby tak było
101010
, nadal byłby to szereg geometryczny (2×4^0 + 2×4^1 + 2×4^2
), co wynika2×4^3//3
z powyższych powodów.W każdym razie,
4^3
i2×4^3
po prostu być najmniej znaczącego bitu, który uzyskujemy poprzezn&-n
:Zauważamy, że uzupełnieniem
n
jest00111111
. Jeśli dodamy jeden, staje się01000000
i nakłada się tylkon=11000000
na co najmniej znaczącą cyfrę. Zauważ, że „uzupełnij i dodaj jeden” to tylko negacja.źródło
lambda n:(n&-n)//3+n
też działa? Przechodzi wszystkie przykładowe przypadki testowe , ale według mojej intuicji nie powinno to być prawidłowe, prawda?Galaretka , 5 bajtów
Wypróbuj online!
Tym razem port podejścia Leaky Nun (przynajmniej pomogłem mu trochę w golfa: P)
Galaretka , 7 bajtów
Wypróbuj online!
Wykorzystuje fantastyczne podejście JungHwan Min , z pośrednią pomocą Martina Endera .
źródło
&N:3|
. Gratulacje; pokonałeś Dennisa w galarecie! (Ale nie całkiem spoza golfa.)Wolfram Language (Mathematica) ,
36282624 bajtów-8 bajtów dzięki @MartinEnder i -2 bajtów dzięki @ Mr.Xcoder
Wypróbuj online!
Musimy tylko znaleźć liczbę zer końcowych na wejściu i znaleźć liczbę z naprzemiennymi
0
si i1
s o długości mniejszej niż ta, i dodać ją do wejścia.Więc,
400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405
Wyraźny wzór na
n
liczbę th z naprzemiennymi1
si i0
s podano w A000975 na OEIS. Możemy użyćn
tej liczby, ponieważ żadne dwie różne liczby nie mogą mieć tej samej długości w systemie binarnym i mieć na przemian cyfry.źródło
2^#~IntegerExponent~2
jest(BitXor[#,#-1]+1)/2
#+⌊(#~BitAnd~-#)/3⌋&
.J ,
1918 bajtówWypróbuj online!
Szybkie wyjaśnienie
To stara odpowiedź, ale z natury jest bardzo podobna do obecnej, po prostu inaczej zlicza końcowe zera. Zobacz komentarze do linku wyjaśniającego, jak to działa.
Inne odpowiedzi:
Poprzednia odpowiedź (19 bajtów).
Dłuższy niż powinien być, ponieważ
\
biegnie od prawej do lewej.źródło
+(2|-.i.@#.-.)&.#:
#.~
liczy liczbę końcowych prawd , dlatego potrzebujemy#.~ -. #:
policzyć liczbę zer końcowychJulia 0.6 , 12 bajtów
Wypróbuj online!
źródło
((!n=(n|n))&-n)/3
lub!n=(((n|n)&(-n))/3)
itp|
jest jak+
i&
jest jak*
. Dlategon|n&-n÷3
jest analizowany jakon | ((n&-n) ÷3)
.JavaScript (ES6),
4039 bajtówPobiera dane wejściowe jako 32-bitową liczbę całkowitą.
Przypadki testowe
Pokaż fragment kodu
źródło
05AB1E ,
1385 bajtówZaoszczędź 5 bajtów dzięki panu Xcoderem i zgrabnej formule JungHwan Min Oszczędź
kolejne 3 dzięki panu Xcoderem
Wypróbuj online!
Wyjaśnienie
źródło
(<bitwise and here>3÷+
powinno działać przez ~ 5 bajtów.R ,
7158 bajtówdzięki NofP za -6 bajtów
Wypróbuj online!
Zakłada, że wejście jest 32-bitową liczbą całkowitą. R i tak ma tylko 32-bitowe liczby całkowite (rzutowanie do,
double
gdy liczba całkowita się przepełnia) i tak nie ma 64-bitowych lub niepodpisanych liczb całkowitych.źródło
which.max(n):1-1
aby!cumsum(n)
uzyskać rozwiązanie 65 bajtówpieprzenie mózgu , 120 bajtów
Wypróbuj online!
Zaczyna się od wartości w bieżącej komórce, a kończy na komórce wartością wyjściową. Oczywiście nie zadziała na liczbach powyżej 255, ponieważ jest to limit komórek dla typowego pieprzenia mózgu, ale zadziała, jeśli założymy nieskończony rozmiar komórki.
źródło
PowerShell , 168 bajtów
Wypróbuj online!
Auć. Konwersja do / z krojenia binarnego i tablicowego nie jest tak naprawdę mocną stroną PowerShell.
Pobiera dane wejściowe
$n
jako liczbę. Natychmiast przekazujemyconvert
to do bazy binarnej2
i przechowujemy w$a
. Następnie mamy konstrukcję if / else. Klauzula if sprawdza, czy wartośćregex
Match
przeciw 1 lub więcej0
s na końcu łańcucha ('0+$'
) ma swojąindex
lokalizację większą niż0
(tj. Początek łańcucha binarnego). Jeśli tak, to mamy z czym pracować,else
po prostu wypisujemy liczbę.Wewnątrz wycinamy pierwsze cyfry i
if
łączymyx
tablice+
z pozostałymi cyframi. Jednak w przypadku pozostałych cyfr przeglądamy je i wybieramy albo a,0
albo1
zamiast niego, używając$i++%2
do wyboru. To daje nam010101...
wzór zamiast0
s na końcu. Następnie łączymy to z powrotem w-join
ciąg i$c
przekształcamy z powrotem wInt32
bazę2
.W obu przypadkach liczba pozostawia się w potoku, a dane wyjściowe są niejawne.
źródło
APL + WIN, 43 bajty
Monity o wprowadzenie ekranu
źródło
PowerShell ,
4136 bajtówWypróbuj online! lub Zweryfikuj wszystkie przypadki testowe
Port Dziurawy zakonnicy Python odpowiedź .
Zaoszczędź 5 bajtów dzięki Leaky Nun
źródło
PHP , 47 bajtów
Wypróbuj online!
Naprawdę tylko kolejny port rozwiązania @Leaky Nun
źródło
Perl 5 , 54 bajtów
Wypróbuj online!
źródło
Python 3 , 56 bajtów
Wypróbuj online!
Jeszcze nie bardzo z tego zadowolony, ale tak naprawdę nie chciałem używać formuły ... -2 dzięki Rod . -1 dzięki Jonathan Frech .
źródło
eval(...)
zamiastint(...,2)
mógł zapisać bajt.Rubin , 15 bajtów
Kolejny port podejścia Dziurawej Zakonnicy.
Wypróbuj online!
źródło
Rdza , 18 bajtów
Port podejścia Dziurawej Zakonnicy
Wypróbuj online!
źródło
AWK , 24 bajty
Port odpowiedzi Mathmatica autorstwa JungHwan Min
Wypróbuj online!
źródło
JavaScript ES6, 13 bajtów
źródło
C, 56 bajtów
Wypróbuj online!
C (gcc), 50 bajtów
Wypróbuj online!
5148 bajtów przy użyciu rozwiązania Arnauld :Dzięki @ l4m2 za oszczędność trzech bajtów!
Wypróbuj online!
43 z gcc:
Wypróbuj online!
źródło
0xAAAAAAAA
=>-1u/3*2
Pari / GP , 19 bajtów
Port podejścia Dziurawej Zakonnicy.
Wypróbuj online!
źródło
Galaretka , 13 bajtów
Wypróbuj online!
Wyjaśnienie
Weź 24 jako przykładowe dane wejściowe.
źródło