Tujuan Anda adalah membuat fungsi atau program untuk membalikkan bit dalam rentang bilangan bulat yang diberi bilangan bulat n . Dengan kata lain, Anda ingin menemukan permutasi bit-reversal dari rentang 2 n item, diindeks nol. Ini juga merupakan urutan OEIS A030109 . Proses ini sering digunakan dalam komputasi Fast Fourier Transforms, seperti algoritma Cooley-Tukey di tempat untuk FFT. Ada juga tantangan untuk menghitung FFT untuk urutan di mana panjangnya adalah kekuatan 2.
Proses ini mengharuskan Anda untuk mengulangi rentang [0, 2 n -1] dan mengubah setiap nilai menjadi biner dan membalikkan bit dalam nilai tersebut. Anda akan memperlakukan setiap nilai sebagai n- digit angka dalam basis 2 yang berarti pembalikan hanya akan terjadi di antara n bit terakhir .
Misalnya, jika n = 3, kisaran bilangan bulat adalah [0, 1, 2, 3, 4, 5, 6, 7]
. Ini adalah
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
di mana setiap indeks i dikonversi ke indeks j menggunakan bit-reversal. Ini berarti outputnya adalah [0, 4, 2, 6, 1, 5, 3, 7]
.
Output untuk n dari 0 hingga 4 adalah
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Anda mungkin telah memperhatikan pembentukan pola. Diberikan n , Anda dapat mengambil urutan sebelumnya untuk n -1 dan menggandakannya. Kemudian gabungkan daftar yang digandakan ke daftar ganda yang sama tetapi bertambah satu. Memperlihatkan,
[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]
dimana ⊕
merupakan gabungan.
Anda dapat menggunakan salah satu dari dua metode di atas untuk membentuk solusi Anda. Jika Anda tahu cara yang lebih baik, Anda bebas untuk menggunakannya juga. Metode apa pun baik-baik saja asalkan menghasilkan hasil yang benar.
Aturan
- Ini adalah kode-golf sehingga solusi terpendek menang.
- Builtin yang memecahkan tantangan ini secara keseluruhan dan builtin yang menghitung bit-reversal dari suatu nilai tidak diperbolehkan. Ini tidak termasuk builtin yang melakukan konversi biner atau operasi bitwise lainnya.
- Solusi Anda setidaknya harus valid untuk n dari 0 hingga 31.
0
alih-alih [0]
atau haruskah itu daftar?
IntegerReverse[Range[2^#]-1,2,#]&
,. (Saya tidak tahu mengapa Mathematica membutuhkan built-in tapi saya kira itu tidak jauh lebih aneh daripadaSunset
...)