Ihr Ziel ist es, eine Funktion oder ein Programm zu erstellen, um die Bits in einem Bereich von Ganzzahlen mit einer Ganzzahl n umzukehren . Mit anderen Worten, Sie möchten die Bit-Umkehr-Permutation eines Bereichs von 2 n Elementen mit einem Index von Null ermitteln. Dies ist auch die OEIS-Sequenz A030109 . Dieser Prozess wird häufig bei der Berechnung schneller Fouriertransformationen verwendet, beispielsweise beim direkten Cooley-Tukey-Algorithmus für FFT. Es gibt auch eine Herausforderung für die Berechnung der FFT für Sequenzen, bei denen die Länge eine Potenz von 2 ist.
Bei diesem Vorgang müssen Sie den Bereich [0, 2 n -1] durchlaufen und jeden Wert in einen Binärwert umwandeln und die Bits in diesem Wert umkehren. Sie behandeln jeden Wert als eine n- stellige Zahl in Basis 2, was bedeutet, dass die Umkehrung nur zwischen den letzten n Bits erfolgt.
Wenn beispielsweise n = 3 ist, ist der Bereich von ganzen Zahlen [0, 1, 2, 3, 4, 5, 6, 7]
. Diese sind
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
wobei jeder Index i unter Verwendung von Bitumkehrung in einen Index j umgewandelt wird . Dies bedeutet, dass die Ausgabe ist [0, 4, 2, 6, 1, 5, 3, 7]
.
Die Ausgaben für n von 0 bis 4 sind
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Möglicherweise haben Sie eine Musterbildung bemerkt. Mit n können Sie die vorherige Folge für n -1 nehmen und verdoppeln. Verknüpfen Sie dann diese Doppelliste mit derselben Doppelliste, aber inkrementiert um eins. Zeigen,
[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]
wo ⊕
darstellt Verkettung.
Sie können eine der beiden oben genannten Methoden verwenden, um Ihre Lösung zu bilden. Wenn Sie einen besseren Weg kennen, können Sie diesen auch nutzen. Jede Methode ist in Ordnung, solange sie die richtigen Ergebnisse liefert.
Regeln
- Das ist Code-Golf, also gewinnt die kürzeste Lösung.
- Builtins, die diese Herausforderung als Ganzes lösen, und Builtins, die die Bitumkehr eines Werts berechnen, sind nicht zulässig. Dies schließt keine eingebauten Funktionen ein, die Binärkonvertierungen oder andere bitweise Operationen ausführen.
- Ihre Lösung muss mindestens für n von 0 bis 31 gültig sein .
0
statt [0]
oder ist es eine Liste sein müssen?
IntegerReverse[Range[2^#]-1,2,#]&
. (Ich weiß nicht, warum Mathematica das eingebaute braucht, aber ich denke, es ist nicht viel seltsamer alsSunset
...)