Amacınız bir işlev veya bir tamsayı verilen tamsayılar bir dizi bit tersine çevirmek için bir program oluşturmaktır n . Başka bir deyişle, bulmak istediğiniz bit ters permütasyon 2 bir dizi n öğeleri, sıfır endekslendi. Bu aynı zamanda OEIS dizisi A030109'dur . Bu işlem genellikle FFT için yerinde Cooley-Tukey algoritması gibi Hızlı Fourier Dönüşümlerini hesaplamada kullanılır. Uzunluğun 2 bir güç olduğu sekanslar için FFT'yi hesaplamak için bir zorluk da vardır .
Bu işlem, [0, 2 n -1] aralığı üzerinde yineleme yapmanızı ve her değeri ikili değere dönüştürmenizi ve bu değerdeki bitleri ters çevirmenizi gerektirir. Her değeri temel 2'de bir n- dijit sayısı olarak ele alacaksınız, bu durumda tersine çevirme yalnızca son n bit arasında gerçekleşecektir .
Örneğin, n = 3 ise, tam sayı aralığı [0, 1, 2, 3, 4, 5, 6, 7]
. Bunlar
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
Burada her bir i indeksi , bit-ters çevirme kullanarak bir j indisine dönüştürülür . Bu, çıktı olduğu anlamına gelir [0, 4, 2, 6, 1, 5, 3, 7]
.
0 dan 4 e kadar olan n sayısı
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Bir desen oluşumu fark etmiş olabilirsiniz. N verildiğinde , önceki diziyi n -1 için alabilir ve iki katına çıkarabilirsiniz . Ardından, iki katına çıkan listeyi aynı çift listeyle birleştirin, ancak bir tarafından artırın. Göstermek için,
[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]
burada ⊕
birleştirme temsil eder.
Çözümünüzü oluşturmak için yukarıdaki iki yöntemden birini kullanabilirsiniz. Daha iyi bir yol biliyorsanız, onu kullanmakta özgürsünüz. Doğru sonuçlar çıktığı sürece herhangi bir yöntem iyidir.
kurallar
- Bu kod golf yani en kısa çözüm kazanır.
- Bu sorunu bir bütün olarak çözen yerleşiklere ve bir değerin bit tersini hesaplayan yerleşiklere izin verilmez. Bu, ikili dönüşüm veya diğer bitsel işlemleri gerçekleştiren yerleşikleri içermez.
- Çözümünüz, en azından, 0 ile 31 arasında n için geçerli olmalıdır .
0
Bunun yerine yazdırabilir miyiz [0]
yoksa liste mi olmalı?
IntegerReverse[Range[2^#]-1,2,#]&
,. ( Mathematica'nın neden bu kadar dahili bir sisteme ihtiyacı olduğunu bilmiyorum ama sanırım bundan daha tuhaf değilSunset
...)