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.
0
zamiast [0]
czy to musi być lista?
IntegerReverse[Range[2^#]-1,2,#]&
. (Nie wiem, dlaczego Mathematica potrzebuje tego wbudowanego, ale myślę, że nie jest to dużo dziwniejsze niżSunset
...)