Twoim celem jest utworzenie funkcji lub programu do odwracania bitów w zakresie liczb całkowitych podanych liczbą całkowitą n . Innymi słowy, chcesz znaleźć permutację odwracania bitów dla zakresu 2 n elementów o indeksie zerowym. Jest to również sekwencja OEIS A030109 . Proces ten jest często wykorzystywany do obliczania szybkich transformacji Fouriera, takich jak lokalny algorytm Cooleya-Tukeya dla FFT. Istnieje również wyzwanie przy obliczaniu FFT dla sekwencji, których długość jest potęgą 2.
Ten proces wymaga iteracji w zakresie [0, 2 n -1] oraz konwersji każdej wartości na binarną i odwrócenia bitów tej wartości. Będziesz traktował każdą wartość jako liczbę n- cyfrową w bazie 2, co oznacza, że odwrócenie nastąpi tylko wśród ostatnich n bitów.
Na przykład, jeśli n = 3, zakres liczb całkowitych wynosi [0, 1, 2, 3, 4, 5, 6, 7]
. To są
i Regular Bit-Reversed j
0 000 000 0
1 001 100 4
2 010 010 2
3 011 110 6
4 100 001 1
5 101 101 5
6 110 011 3
7 111 111 7
gdzie każdy indeks i jest konwertowany na indeks j przy użyciu odwracania bitów. Oznacza to, że wyjście jest [0, 4, 2, 6, 1, 5, 3, 7]
.
Dane wyjściowe dla n od 0 do 4 wynoszą
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Być może zauważyłeś tworzenie wzoru. Biorąc pod uwagę n , możesz wziąć poprzednią sekwencję dla n -1 i podwoić ją. Następnie połącz podwójną listę z tą samą podwójną listą, ale zwiększ ją o jedną. Pokazywać,
[0, 2, 1, 3] * 2 = [0, 4, 2, 6]
[0, 4, 2, 6] + 1 = [1, 5, 3, 7]
[0, 4, 2, 6] ⊕ [1, 5, 3, 7] = [0, 4, 2, 6, 1, 5, 3, 7]
gdzie ⊕
reprezentuje konkatenację.
Możesz użyć jednej z dwóch powyższych metod, aby utworzyć rozwiązanie. Jeśli znasz lepszy sposób, możesz również z niego korzystać. Każda metoda jest w porządku, o ile daje prawidłowe wyniki.
Zasady
- To jest golf golfowy, więc wygrywa najkrótsze rozwiązanie.
- Wbudowane rozwiązania, które rozwiązują to wyzwanie jako całość, oraz wbudowane obliczające odwrócenie bitów wartości są niedozwolone. Nie obejmuje to wbudowanych, które wykonują konwersję binarną lub inne operacje bitowe.
- Twoje rozwiązanie musi być co najmniej ważne od n od 0 do 31.
IntegerReverse[Range[2^#]-1,2,#]&
. (Nie wiem, dlaczego Mathematica potrzebuje tego wbudowanego, ale myślę, że nie jest to dużo dziwniejsze niżSunset
...)0
zamiast[0]
czy to musi być lista?Odpowiedzi:
Galaretka ,
76 bajtówDzięki @EriktheOutgolfer za grę w golfa na 1 bajcie!
Wypróbuj online!
Jak to działa
źródło
05AB1E , 8 bajtów
Kod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
0)ïsF·D>«
był jednak blisko. Miałem pewne problemy z „0”.¾
. Będę musiał pamiętać tę sztuczkę.MATL,
13121098 bajtówWypróbuj online
Wyjaśnienie
Dla kompletności, oto moja stara odpowiedź przy użyciu podejścia nierekurencyjnego (9 bajtów).
Wypróbuj online
Wyjaśnienie
źródło
J,
1511 bajtówIstnieje 15 bajtów, które wykorzystują bezpośrednią konwersję binarną i odwracanie.
Stosowanie
Wyjaśnienie
źródło
Galaretka , 5 bajtów
Wypróbuj online!
-1 dzięki Dennisowi .
źródło
Haskell ,
4037 bajtówWypróbuj online!
Dzięki @Laikoni za trzy bajty!
źródło
Oktawa, 37 bajtów
Tworzy anonimową funkcję o nazwie,
ans
którą można po prostu wywołać za pomocąans(n)
.Demo online
źródło
Python 2,
565554 bajtówPrzetestuj na Ideone .
Dzięki @xnor za grę w golfa na 1 bajcie!
źródło
[0][n:]or
.Jawa,
422419 bajtów:Cóż, w końcu nauczyłem się języka Java dla mojego drugiego języka programowania, więc chciałem wykorzystać moje nowe umiejętności do wykonania prostego wyzwania i chociaż okazało się to bardzo długo, nie jestem rozczarowany. Cieszę się, że udało mi się ukończyć proste wyzwanie w Javie.
Wypróbuj online! (Ideone)
źródło
Mathematica,
5633 bajtówLiczba bajtów zakłada źródło zakodowane w standardzie ISO 8859-1.
Używa definicji rekurencyjnej do zdefiniowania jednoargumentowego operatora
±
.źródło
Perl,
4645 bajtówObejmuje +1 dla
-p
Podaj numer wejścia na STDIN
źródło
Pyth - 11 bajtów
Pakiet testowy .
źródło
JavaScript ES6,
655351 bajtówWykorzystuje rekurencyjny algorytm podwójnej inkrementacji-konkat.
Przykładowe przebiegi:
źródło
f=n=>n>0?(r=f(n-1).map(i=>i*2)).concat(r.map(i=>i+1)):[0]
?n==1
, dzięki.f=(n,m=1)=>n?[...n=f(n-1,m+m),...n.map(i=>i+m)]:[0]
Python 3,
6759 bajtówDzięki @Dennis za -8 bajtów
Równie dobrze możemy mieć (zmodyfikowaną) prostą implementację w Pythonie, nawet jeśli jest to dość długa.
Anonimowa funkcja, która pobiera dane wejściowe przez argument i zwraca permutację z odwróceniem bitów jako listę.
Jak to działa
Wypróbuj na Ideone
źródło
Dyalog APL , 12 bajtów
Wymaga
⎕IO←0
ustawienia domyślnego w wielu systemach.2⊥
od-base-2 z⊖
przewrócił2⊥⍣¯1
odwrotność od-base-2 z⍳
pierwsze n liczb całkowitych, gdzie n jest2*
2 do potęgi⎕
wprowadzanie numeryczneWypróbuj APL online!
Dla porównania, oto inna metoda:
(
funkcja pociągu ...2∘×
dwa razy (argument),
połączone z1+
jeden plus2∘×
dwa razy (argument))⍣
stosowane tyle razy, ile określono przez⎕
wprowadzanie numeryczne⊢
na0
zeroźródło
(⍋,⍨)⍣⎕⊢0
(⎕io←0
)K (ngn / k) ,
118 bajtówWypróbuj online!
&
jest ostatnim czasownikiem w kompozycji, więc musimy:
wymusić, aby był monadycznyźródło
Julia,
2322 bajtówRaczej prosta implementacja procesu opisanego w specyfikacji wyzwania.
Wypróbuj online!
źródło
Pyth, 8 bajtów
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
źródło
Clojure, 78 bajtów
Wystarczy postępować zgodnie ze specyfikacją ...
źródło
Rubinowy, 57 bajtów:
źródło
PHP, 57 bajtów
pobiera dane wejściowe z parametru wiersza poleceń, drukuje wartości rozdzielane znakami podkreślenia. Uruchom z
-nr
.rozwiązanie rekurencyjne, 72 bajty
funkcja przyjmuje liczbę całkowitą, zwraca tablicę
źródło
Rubinowy , 51 bajtów
Wypróbuj online!
źródło
Perl 6 , 42 bajtów
Wypróbuj online!
Zwiększenie liczby całkowitej po prostu odwraca sekwencję najmniej znaczących bitów, na przykład od
xxxx0111
doxxxx1000
. Tak więc następny indeks odwróconego bitu można uzyskać z poprzedniego, odwracając sekwencję najbardziej znaczących bitów. Maskę XOR można obliczyćm - (m >> (ctz(i) + 1))
za pomocą dlam = 2**n
lubm = 2**n-1
.Perl 6 , 30 bajtów
Wypróbuj online!
Podejście rekurencyjne.
źródło
JavaScript (Firefox 30-57), 48 bajtów
Port of @ Dennis ♦ rozwiązanie Python 2.
źródło
Japt ,
1413 bajtówWypróbuj online!
Rozpakowane i jak to działa
Prosta implementacja.
źródło
n2
:Í
APL (Dyalog Classic) , 9 bajtów
Wypróbuj online!
⎕
oceniane dane wejściowe(
)⍣⎕⊢0
zastosuj tę rzecz(
)
wiele razy, zaczynając od0
,⍨
połącz bieżący wynik z samym sobą⍋
wskaźniki permutacji sortującej rosnącoźródło
x 86, 31 bajtów
Trwa dostatecznie duży
int[] buffer
weax
a n wecx
i zwraca buforeax
.Implementuje algorytm konkatenacji podany w instrukcji wyzwanie. Może być możliwe zapisanie bajtów poprzez zwiększenie wskaźników o 4 zamiast bezpośredniego korzystania z dostępu do tablicy, ale
lea
/mov
jest już dość krótki (3 bajty na 3 regi i mnożnik).Hexdump:
źródło