Mục tiêu của bạn là tạo ra một hàm hoặc một chương trình để đảo ngược các bit trong một phạm vi số nguyên cho một số nguyên n . Nói cách khác, bạn muốn tìm hoán vị bit đảo ngược của một phạm vi gồm 2 n mục, không có chỉ mục. Đây cũng là chuỗi OEIS A030109 . Quá trình này thường được sử dụng trong tính toán Biến đổi Fourier nhanh, chẳng hạn như thuật toán Cooley-Tukey tại chỗ cho FFT. Ngoài ra còn có một thách thức cho việc tính toán FFT cho các chuỗi trong đó độ dài là 2.
Quá trình này yêu cầu bạn lặp lại trong phạm vi [0, 2 n -1] và để chuyển đổi từng giá trị thành nhị phân và đảo ngược các bit trong giá trị đó. Bạn sẽ coi mỗi giá trị là một số n chữ số trong cơ sở 2, điều đó có nghĩa là sự đảo ngược sẽ chỉ xảy ra trong số n bit cuối cùng .
Ví dụ: nếu n = 3, phạm vi số nguyên là [0, 1, 2, 3, 4, 5, 6, 7]
. đó là
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
trong đó mỗi chỉ số i được chuyển đổi thành chỉ mục j bằng cách sử dụng đảo ngược bit. Điều này có nghĩa là đầu ra là [0, 4, 2, 6, 1, 5, 3, 7]
.
Đầu ra cho n từ 0 đến 4 là
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Bạn có thể đã nhận thấy một mô hình hình thành. Cho n , bạn có thể lấy chuỗi trước cho n -1 và nhân đôi nó. Sau đó nối danh sách nhân đôi đó vào cùng một danh sách kép nhưng tăng thêm một. Để hiển thị,
[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]
trong đó ⊕
đại diện cho sự kết hợp.
Bạn có thể sử dụng một trong hai phương pháp trên để hình thành giải pháp của mình. Nếu bạn biết một cách tốt hơn, bạn cũng có thể sử dụng nó. Bất kỳ phương pháp nào cũng được miễn là nó cho kết quả chính xác.
Quy tắc
- Đây là môn đánh gôn nên giải pháp ngắn nhất sẽ thắng.
- Các công cụ xây dựng giải quyết thách thức này nói chung và các công cụ tính toán đảo ngược bit của một giá trị không được phép. Điều này không bao gồm các nội dung thực hiện chuyển đổi nhị phân hoặc các hoạt động bitwise khác.
- Giải pháp của bạn ít nhất phải có giá trị cho n từ 0 đến 31.
0
thay vì [0]
hoặc nó phải là một danh sách?
IntegerReverse[Range[2^#]-1,2,#]&
. (Tôi không biết tại sao Mathicala cần tích hợp sẵn nhưng tôi đoán nó không lạ hơnSunset
...)