Il tuo obiettivo è creare una funzione o un programma per invertire i bit in un intervallo di numeri interi dato un numero intero n . In altre parole, si desidera trovare la permutazione di inversione di bit di un intervallo di 2 n elementi, con indice zero. Questa è anche la sequenza OEIS A030109 . Questo processo viene spesso utilizzato nel calcolo delle trasformazioni di Fourier veloci, come l'algoritmo Cooley-Tukey sul posto per FFT. Esiste anche una sfida per il calcolo della FFT per sequenze in cui la lunghezza è una potenza di 2.
Questo processo richiede di scorrere nell'intervallo [0, 2 n -1] e di convertire ciascun valore in binario e invertire i bit in quel valore. Tratterai ciascun valore come un numero n -digit nella base 2, il che significa che l'inversione avverrà solo tra gli ultimi n bit.
Ad esempio, se n = 3, l'intervallo di numeri interi è [0, 1, 2, 3, 4, 5, 6, 7]
. Questi sono
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
dove ogni indice i viene convertito in un indice j usando l'inversione dei bit. Ciò significa che l'output è [0, 4, 2, 6, 1, 5, 3, 7]
.
Le uscite per n da 0 a 4 sono
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Potresti aver notato che si sta formando un motivo. Dato n , puoi prendere la sequenza precedente per n -1 e raddoppiarla. Quindi concatena quell'elenco raddoppiato con lo stesso doppio elenco ma incrementato di uno. Mostrare,
[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]
dove ⊕
rappresenta la concatenazione.
È possibile utilizzare uno dei due metodi sopra per formare la soluzione. Se conosci un modo migliore, sei libero di usarlo anche tu. Qualsiasi metodo va bene purché produca i risultati corretti.
Regole
- Questo è code-golf, quindi vince la soluzione più breve.
- Non sono consentiti i builtin che risolvono questa sfida nel suo insieme e quelli che calcolano l'inversione dei bit di un valore. Questo non include i builtin che eseguono la conversione binaria o altre operazioni bit a bit.
- La soluzione deve essere almeno valida per n da 0 a 31.
0
invece [0]
o deve essere un elenco?
IntegerReverse[Range[2^#]-1,2,#]&
. (Non so perché Mathematica abbia bisogno di questo integrato ma immagino che non sia molto più strano diSunset
...)