Opis zadania
Biorąc pod uwagę liczbę całkowitą, zamień jej (2k – 1) -ty i 2k- najmniej znaczący bit dla wszystkich liczb całkowitych k> 0 . Jest to sekwencja A057300 w OEIS.
(Zakłada się, że liczba ma „nieskończenie wiele” zer wiodących. W praktyce oznacza to po prostu wstawienie pojedynczego bitu 0 do liczb nieparzystych).
To jest golf golfowy , więc wygrywa najkrótszy kod (w bajtach).
Przypadki testowe
0 -> 0
1 -> 2
9 -> 6
85 -> 170
220 -> 236
1827 -> 2835
47525 -> 30298
unsigned char array_of_bytes[1024]
działania w sposób zgodny z oczekiwaniami (tj. Pole bitowe z 1024 *CHAR_BIT
wpisami). Wyobrażam sobie, że większość odpowiedzi na dane wejściowe o dowolnej długościCHAR_BIT
jest nawet taka , ponieważ przesuwanie bitów między bajtami jest uciążliwe. Więc absolutnie możesz nałożyć wymóg obsługik
do pewnego stałego rozmiaru, takiego jak 256 lub coś, co jest rozsądne dla AES, a języki bez 256-bitowych liczb całkowitych musiałyby używać pętli. To może sprawić, że wektory SIMD będą warte rozważenia dla odpowiedzi asm x86: POdpowiedzi:
Galaretka ,
1097 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Python 2, 26 bajtów
Triki!
Say
n
ma formę...ghfedcba
binarną. Następnie możemy podzielić go na każdy inny kawałek jakoNastępnie wynik z przełączaniem bitów
s
można wyrazić jakos=2*o+e
.Wolimy obliczyć tylko jeden
e
io
tak możemy wyrazićo=n-2*e
i substytutemTak więc teraz pozostaje wyrazić
e
w kategoriachn
. LiczbaM=4**n/3
ma postać...10101010101
binarną, która służy jako maska dla cyfr nieparzystych. Wykładnikn
zapewnia, żeM
jest wystarczająco długi. Biorąc bitand
pon/2
i ta wartość dajee
zgodnie z życzeniem.Zamiast tego możemy wyrazić
e
w kategoriacho
e=(n-o)/2
, co dajes=(n+o*3)/2
, co oszczędza bajt dzięki optymalizacji z xsot.źródło
n
. Wolę jednak odwrotną konwencję nazewnictwa „nieparzysta” kontra „parzysta”. LSB to bit 0, który jest parzysty (nawet jeśli jest to pierwszy bit). W programowaniu SIMD, gdzie tasowanie często wybiera elementy z indeksem, indeksy liczą od 0, więc normalne jest uznawanie niskiego elementu za parzysty element. np.[ 3 2 1 0 ]
lambda n:n+(n&4**n/3)*3>>1
f(x){return x+((x&~0U/3)*3)>>1;}
zwraca 1 dla wejścia 2 .calc
(aka apcalc), a nie w C. Myślałem, że będę w porządku, ponieważ nie potrzebowałem skracania do 32-bitów lub dwóch uzupełnień. Nie sądziłem, że to wyrażenie wygląda dobrze, więc byłem gotów uwierzyć w moje złe testy. Ale tak czy inaczej, potrzebuję lepszego REPL do rozwijania bithacków. Jakieś sugestie? (najlepiej wiersz poleceń systemu Linux, taki jakbc -l
lubcalc
, ale w rzeczywistości ujawniającyint32_t
/uint32_t
lub coś, a nie rozszerzoną precyzję.)Funkcja C, 38
Kręcenie bitów:
Ideone.
Lub dla zabawy:
Funkcja rekurencyjna C, 43
Zgodnie z wzorem OEIS ,
a(4n+k) = 4a(n) + a(k), 0 <= k <= 3
lub
Ideone.
źródło
CJam,
161413 bajtówSprawdź to tutaj.
Wyjaśnienie
źródło
Pyth, 9 bajtów
Wypróbuj w kompilatorze Pyth .
Jak to działa
źródło
JavaScript (ES6),
3230 bajtówDziała tylko do 1073741823 ze względu na ograniczenia liczb całkowitych JavaScript.
3836 bajtów działa do 4294967295:Edycja: Zapisano 2 bajty dzięki @ user81655.
51 bajtów działa do 4503599627370495:
źródło
n<<1
byćn*2
?n/2
! Nie wiem, dlaczego wcześniej o tym nie myślałem.>>>
... co to jest?>>>
ale robi niepodpisaną zmianę.>>>0
w zasadzie konwertuje na 32-bitową liczbę całkowitą bez znaku.Funkcja asm x86: 14 bajtów kodu maszynowego
wersja uint64_t: 24 bajty
Konwencja wywoływania SysV x86-64 (
x
inedi
), ale ten sam kod maszynowy będzie również działał w trybie 32-bitowym. (Gdzielea
dekoduje jakolea eax, [edi + eax*2]
, co daje identyczne wyniki ).0x4f - 0x40
= 14 bajtówJest to wynik kompilatora wynikający z zastosowania doskonałej idei maski xnor - kiedyś w odwrotny sposób. (I przeciwna terminologia: niski bit to bit 0, który jest parzysty, a nie nieparzysty.)
Nie znalazłem żadnych ulepszeń w stosunku do kompilatora. Mógłbym napisać to jako
mov eax, 0x555...
/and eax, edi
, ale to ta sama długość.Ta sama funkcja dla liczb całkowitych 64-bitowych zajmuje 24 bajty (patrz łącze godbolt). Nie widzę krótszego niż 10 bajtów sposobu
movabs rax, 0x55...
na wygenerowanie maski w rejestrze. (div
instrukcja x86 jest nieporęczna, więc niepodpisany podział wszystkich przez 3 nie pomaga).Wymyśliłem pętlę, aby wygenerować maskę w rax, ale ma ona 10 bajtów (dokładnie takiej samej długości jak
mov imm64
).Gdybyśmy wiedzieli, że żaden z istniejących bajtów
rax
nie ma ustawionego niskiego bitu, moglibyśmy pominąć tenxor
, a miałby on długość 8 bajtów.Poprzednia wersja tej odpowiedzi miała 10-bajtową pętlę używającą
loop
insn, ale miała najgorszy czas wykonywania0xFFFFFFFFFFFFFF08
iteracji, ponieważ ja tylko ustawiłemcl
.źródło
Oaza , 17 bajtów (niekonkurujące)
Wypróbuj online!
Oasis to język zaprojektowany przez Adnana, który specjalizuje się w sekwencjach.
Obecnie ten język może wykonywać rekurencję i formę zamkniętą.
Używamy tej formuły:
a(4n+k) = 4a(n) + a(k), 0 <= k <= 3
Określenie podstawowego przypadku jest proste:
3120
na końcu oznacza to po prostua(0)=0, a(1)=2, a(2)=1, a(3)=3
.źródło
MATL , 10 bajtów
Wypróbuj online!
Zmodyfikowana wersja, aby wygenerować pierwsze warunki sekwencji ( OEIS A057300 ).
Wyjaśnienie
źródło
zsh, 28 bajtów
Pobiera dane wejściowe jako argument wiersza poleceń, dane wyjściowe w STDOUT.
Nie jest kompatybilny z Bash, ponieważ wykorzystuje specyficzną dla Zsh podstawową składnię konwersji.
źródło
Siatkówka, 70 bajtów
Zestaw testowy. (Lekko zmieniony.)
Cóż, dla zabawy: 7 bajtów
Pobiera base-4 jako wejście, a wyjścia jako base-4.
Wypróbuj online!
źródło
05AB1E, 8 bajtów
Dzięki @Adnan za -5 bajtów!
Wykorzystuje kodowanie CP-1252.
Wypróbuj online!
Wyjaśnienie:
źródło
1 2‚2 1‚
z12Â
8 bajtów.4в2‰íJJC
C,
323029 bajtówAlgorytm skopiowany z komentarza xsot do odpowiedzi xnor na Python . Zamiast maskować w obie strony, zamaskuj w jedną stronę i połącz.
Ten gromadzi do tego samego ASM jako ostatniej wersji testowanej ja , i to działa (za x do
0x3FFFFFFF
i dla x powyższego, że tak długo, jak bit 30 nie jest ustawiony, patrz poniżej). W kodzie maszynowym ma taką samą długość jak moja istniejąca odpowiedź asm.Powyższa wersja zawsze usuwa wysoki wynik wyniku . Najlepsza bezpieczna wersja to 32 bajty:
Wersja Python nie ma tego problemu, ponieważ python używa w razie potrzeby typów liczb całkowitych o dowolnej precyzji , zamiast obcinania do ustalonego górnego limitu.
źródło
>>
to tak niski priorytet. Nie gram wystarczająco często, aby pamiętać dokładnie, jakie są reguły, ponieważ ostrzeżenia kompilatora sugerujące parens w niebezpiecznych przypadkach zapisują mnie w prawdziwym kodzie. : PJavaScript (ES6),
113109 bajtówZaoszczędź 4 bajty dzięki Upgoat
Jak to działa
źródło
+('0b"+binary_string_here)
zamiast `parseInt (..., 2)J, 20 bajtów
Stosowanie
Gdzie
>>
jest STDIN i<<
STDOUT.Nie golfił
Trzy widelce.
Dygresja
W oficjalnym tłumaczu
^:_1
można go zastąpićinv
, oszczędzając 1 bajt.Jednak żaden z tłumaczy internetowych tego nie wdraża.
źródło
C #, 44 bajty
Na podstawie implementacji C.
int f(int n)=>n>3?4*f(n/4)+f(n%4):n%2*2+n/2;
Wypróbuj tutaj: C # pad
źródło
INTERCAL , 60 bajtów
Wypróbuj online!
Działa dla 16-bitowych liczb całkowitych, a operacje we / wy są wykonywane w najbardziej naturalnym formacie dla INTERCAL: dane wejściowe to seria cyfr dziesiętnych wypisanych w jednym z kilku języków naturalnych lub skonstruowanych, a dane wyjściowe są zapisane w „rzeźbionych cyfrach rzymskich”.
Jest to jedno z tych rzadkich wyzwań, w których operatory binarne INTERCAL mogą faktycznie być używane w ogóle intuicyjnie, ponieważ chodzi o repozycjonowanie bitów. Select (
~
) pobiera bity z pierwszego argumentu odpowiadającego jedynkom w drugim argumencie i dopełnia je zerami w prawo, a mingle ($
) przeplata bity z argumentów tak, że bity z pierwszego argumentu są bardziej znaczące. Zatem prostym rozwiązaniem jest wybranie mniej znaczących przemiennych bitów (.1~#21845
), wybranie bardziej znaczących przemiennych bitów (.1~#43690
) i przeplataj je z powrotem w odwrotnej kolejności. Na szczęście dla liczby bajtów, chociaż operatory INTERCAL nie mają zdefiniowanego pierwszeństwa (ponieważ celem języka jest brak precedensów), okazuje się, że C-INTERCAL na TIO nie wymaga dużego grupowania dla tego konkretnego wyrażenia, kosztując tylko jeden bajt od tego czasu'.
można skrócić!
.Z obsługą 32-bitowych liczb całkowitych:
INTERCAL , 67 bajtów
Wypróbuj online!
INTERCAL nie dopuszcza 32-bitowych literałów, co w rzeczywistości sprawia, że jest to trochę łatwiejsze do odczytania, ponieważ oznacza to, że magiczne stałe do wybierania przemiennych bitów muszą być skonstruowane przez zmieszanie dwóch 16-bitowych literałów razem, gdzie wszystkie są zerami i drugimi wszyscy (W rzeczywistości, nawet gdyby były 32-bitowe literały, byłoby to jeszcze krótsze. Ma
#0$#65535
dwa bajty wyłączone#1431655765
, i to samo dotyczy drugiego.) To komunikuje cały proces nienaturalnie dobrze dla INTERCAL.Alternatywne podejście z niezdarnym użyciem przeciążania operandów :
INTERCAL , 71 bajtów
Wypróbuj online!
To eliminuje wybierając zupełnie oświadczając, że
:1
jest.2
zmieszany z.3
ustawienie:1
do wejścia, a następnie wyprowadzania.3
zaprawione.2
. Ponieważ:1
został przeciążony jako.2$.3
,DO :1 <- :2
przypisuje wartości.2
i.3
takie, które:1
uzyskują wartość:2
, co powoduje, że.2
zawierają bardziej znaczące przemienne bity:2
i.3
zawierają mniej znaczące przemienne bity. Byłby to krótszy z dwóch 32-bitowych rozwiązań o cztery bajty, gdybyPLEASE WRITE IN :1
mógł zostać zastąpionyPLEASE WRITE IN :2 DO :1 <- :2
przeciążeniem:1
, aleCALCULATING
okazuje się konieczne do zastosowania przeciążenia. Wydaje mi się również, że może istnieć krótszy sposób na samodzielne przeładowanie niż uruchomienie programuDO:1<-:1/.2$.3
, ale ponieważ jest to INTERCAL, również czuję, że nie może być.źródło
Mathematica, 44 bajty
Takie samo podejście jak w mojej odpowiedzi CJam: konwersja do base-4, zamiana 1s i 2s, konwersja z powrotem. Wykorzystuje również trik alephalpha do zastąpienia
FromDigits
zFold
pracy, aby zapisać jeden bajt.źródło
Właściwie 16 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
J, 22 bajty
Alternatywne podejście oparte na manipulacji tablicą zamiast sztuczki bazowej 4.
Stosowanie
Wyjaśnienie
źródło
REXX, 88 bajtów
źródło