เป้าหมายของคุณคือการสร้างฟังก์ชั่นหรือโปรแกรมที่จะย้อนกลับบิตในช่วงของจำนวนเต็มให้จำนวนเต็มn กล่าวอีกนัยหนึ่งคุณต้องการค้นหาการเปลี่ยนรูปบิตกลับรายการช่วง 2 nรายการซึ่งไม่มีดัชนี และนี่ก็เป็นลำดับ OEIS A030109 กระบวนการนี้มักใช้ในการคำนวณ Fast Fourier Transforms เช่นอัลกอริทึม Cooley-Tukey ในสถานที่สำหรับ FFT นอกจากนี้ยังมีความท้าทายสำหรับการคำนวณ FFT สำหรับลำดับที่ความยาวคือพลังของ 2
กระบวนการนี้กำหนดให้คุณทำซ้ำในช่วง [0, 2 n -1] และแปลงแต่ละค่าเป็นไบนารีและแปลงบิตในค่านั้น คุณจะได้รับการรักษาแต่ละค่าเป็นnจำนวน -digit ในฐาน 2 ซึ่งหมายถึงการกลับรายการจะเกิดขึ้นในหมู่สุดท้ายnบิต
ตัวอย่างเช่นถ้าn = 3 [0, 1, 2, 3, 4, 5, 6, 7]
ช่วงของจำนวนเต็มคือ เหล่านี้คือ
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
ที่แต่ละดัชนีฉันถูกแปลงเป็นดัชนีjโดยใช้การกลับรายการบิต [0, 4, 2, 6, 1, 5, 3, 7]
ซึ่งหมายความว่าการส่งออกเป็น
เอาต์พุตสำหรับnจาก 0 ถึง 4 คือ
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
คุณอาจสังเกตเห็นรูปแบบการขึ้นรูป รับnคุณสามารถใช้ลำดับก่อนหน้าสำหรับn -1 และเพิ่มเป็นสองเท่า จากนั้นเชื่อมต่อรายการที่สองเท่าให้เป็นรายการคู่เดียวกัน แต่เพิ่มขึ้นทีละหนึ่ง เพื่อที่จะแสดง,
[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]
ซึ่ง⊕
แสดงถึงการต่อกัน
คุณสามารถใช้วิธีใดวิธีหนึ่งจากสองวิธีด้านบนเพื่อสร้างโซลูชันของคุณ หากคุณรู้วิธีที่ดีกว่าคุณมีอิสระที่จะใช้เช่นกัน วิธีการใด ๆ ก็ใช้ได้ตราบใดที่มันออกผลลัพธ์ที่ถูกต้อง
กฎระเบียบ
- นี่คือรหัสกอล์ฟเพื่อให้ทางออกที่สั้นที่สุดชนะ
- บิลด์อินที่แก้ปัญหาความท้าทายนี้โดยรวมและบิลด์อินที่คำนวณการพลิกกลับบิตของค่าไม่ได้รับอนุญาต สิ่งนี้ไม่รวม builtins ซึ่งดำเนินการแปลงแบบไบนารีหรือการดำเนินการระดับบิตอื่น ๆ
- อย่างน้อยที่สุดโซลูชันของคุณจะต้องใช้ได้สำหรับnจาก 0 ถึง 31
0
แทนที่จะ[0]
ต้องเป็นรายการหรือไม่?
IntegerReverse[Range[2^#]-1,2,#]&
awww, (ฉันไม่รู้ว่าทำไม Mathematica จึงต้องการบิวท์อิน แต่ฉันเดาว่ามันไม่แปลกกว่าSunset
... )