Votre objectif est de créer une fonction ou un programme pour inverser les bits dans une plage d'entiers étant donné un entier n . En d'autres termes, vous voulez trouver la permutation d'inversion de bits d'une plage de 2 n éléments, indexés zéro. Il s'agit également de la séquence OEIS A030109 . Ce processus est souvent utilisé dans le calcul de transformées de Fourier rapides, comme l'algorithme Cooley-Tukey sur place pour la FFT. Il existe également un défi pour le calcul de la FFT pour les séquences où la longueur est une puissance de 2.
Ce processus vous oblige à parcourir la plage [0, 2 n -1] et à convertir chaque valeur en binaire et inverser les bits de cette valeur. Vous traiterez chaque valeur comme un nombre à n chiffres dans la base 2, ce qui signifie que l'inversion ne se produira que parmi les n derniers bits.
Par exemple, si n = 3, la plage d'entiers est [0, 1, 2, 3, 4, 5, 6, 7]
. Ceux-ci sont
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
où chaque index i est converti en un index j en utilisant l'inversion de bits. Cela signifie que la sortie est [0, 4, 2, 6, 1, 5, 3, 7]
.
Les sorties pour n de 0 à 4 sont
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Vous avez peut-être remarqué la formation d'un motif. Étant donné n , vous pouvez prendre la séquence précédente pour n -1 et la doubler. Ensuite, concaténez cette liste doublée à la même liste double mais incrémentée d'une unité. Montrer,
[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]
où ⊕
représente la concaténation.
Vous pouvez utiliser l'une des deux méthodes ci-dessus afin de former votre solution. Si vous connaissez un meilleur moyen, vous êtes également libre de l'utiliser. N'importe quelle méthode est correcte tant qu'elle produit les résultats corrects.
Règles
- Il s'agit de code-golf, donc la solution la plus courte l'emporte.
- Les commandes intégrées qui résolvent ce défi dans son ensemble et les commandes intégrées qui calculent l'inversion de bits d'une valeur ne sont pas autorisées. Cela n'inclut pas les commandes intégrées qui effectuent une conversion binaire ou d'autres opérations au niveau du bit.
- Votre solution doit être, au minimum, valable pour n de 0 à 31.
IntegerReverse[Range[2^#]-1,2,#]&
. (Je ne sais pas pourquoi Mathematica a besoin de cette fonction intégrée, mais je suppose que ce n'est pas beaucoup plus étrange queSunset
...)0
place[0]
ou faut-il que ce soit une liste?Réponses:
Gelée ,
76 octetsMerci à @EriktheOutgolfer d'avoir joué au golf sur 1 octet!
Essayez-le en ligne!
Comment ça marche
la source
05AB1E , 8 octets
Code:
Explication:
Utilise l' encodage CP-1252 . Essayez-le en ligne! .
la source
0)ïsF·D>«
était proche cependant. Eu quelques problèmes avec le «0».¾
. Je vais devoir me souvenir de cette astuce.MATL,
13121098 octetsEssayez-le en ligne
Explication
Par souci d'exhaustivité, voici mon ancienne réponse utilisant l'approche non récursive (9 octets).
Essayez-le en ligne
Explication
la source
J,
1511 octetsIl existe une alternative pour 15 octets qui utilise une conversion et une inversion binaires directes.
Usage
Explication
la source
Gelée , 5 octets
Essayez-le en ligne!
-1 merci à Dennis .
la source
Haskell ,
4037 octetsEssayez-le en ligne!
Merci à @Laikoni pour trois octets!
la source
Octave, 37 octets
Crée une fonction anonyme nommée
ans
qui peut simplement être appelée avecans(n)
.Démo en ligne
la source
Python 2,
565554 octetsTestez-le sur Ideone .
Merci à @xnor d'avoir joué au golf sur 1 octet!
la source
[0][n:]or
.Java,
422419 octets:Eh bien, j'ai finalement appris Java pour mon deuxième langage de programmation, donc je voulais utiliser mes nouvelles compétences pour relever un défi simple, et même si cela s'est avéré très long, je ne suis pas déçu. Je suis juste content d'avoir pu relever un simple défi en Java.
Essayez-le en ligne! (Ideone)
la source
Mathematica,
5633 octetsLe nombre d'octets suppose une source codée ISO 8859-1.
Cela utilise la définition récursive pour définir un opérateur unaire
±
.la source
Perl,
4645 octetsComprend +1 pour
-p
Donner le numéro d'entrée sur STDIN
la source
Pyth - 11 octets
Suite de tests .
la source
Javascript ES6,
655351 octetsUtilise l'algorithme récursif à double incrémentation.
L'exemple s'exécute:
la source
f=n=>n>0?(r=f(n-1).map(i=>i*2)).concat(r.map(i=>i+1)):[0]
?n==1
, merci.f=(n,m=1)=>n?[...n=f(n-1,m+m),...n.map(i=>i+m)]:[0]
Python 3,
6759 octetsMerci à @Dennis pour -8 octets
Nous pouvons tout aussi bien avoir une implémentation simple (modifiée) en Python, même si elle est assez longue.
Une fonction anonyme qui prend l'entrée par argument et renvoie la permutation à bits inversés sous forme de liste.
Comment ça marche
Essayez-le sur Ideone
la source
Dyalog APL , 12 octets
Requiert
⎕IO←0
ce qui est par défaut sur de nombreux systèmes.2⊥
de-base-2 de⊖
le retourné2⊥⍣¯1
inverse de la base-2 de⍳
les n premiers entiers, où n est2*
2 à la puissance de⎕
entrée numériqueTryAPL en ligne!
À titre de comparaison, voici l'autre méthode:
(
le train de fonctions ...2∘×
deux fois (l'argument),
concaténé à1+
un plus2∘×
deux fois (l'argument))⍣
appliqué autant de fois que spécifié par⎕
entrée numérique⊢
sur0
zérola source
(⍋,⍨)⍣⎕⊢0
(⎕io←0
)K (ngn / k) ,
118 octetsEssayez-le en ligne!
&
est le dernier verbe de la composition, nous avons donc besoin d'un:
pour le forcer à être monadiquela source
Julia,
2322 octetsMise en œuvre plutôt simple du processus décrit dans la spécification de défi.
Essayez-le en ligne!
la source
Pyth, 8 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
la source
Clojure, 78 octets
Juste en suivant les spécifications ...
la source
Ruby, 57 octets:
la source
PHP, 57 octets
prend l'entrée du paramètre de ligne de commande, imprime les valeurs délimitées par des traits de soulignement. Courez avec
-nr
.solution récursive, 72 octets
la fonction prend un entier, retourne un tableau
la source
Rubis , 51 octets
Essayez-le en ligne!
la source
Perl 6 , 42 octets
Essayez-le en ligne!
L'incrémentation d'un entier inverse simplement une séquence de bits de poids faible, par exemple de
xxxx0111
àxxxx1000
. Ainsi, le prochain index à bits inversés peut être obtenu à partir du précédent en inversant une séquence de bits les plus significatifs. Le masque XOR peut être calculé avecm - (m >> (ctz(i) + 1))
pourm = 2**n
oum = 2**n-1
.Perl 6 , 30 octets
Essayez-le en ligne!
Approche récursive.
la source
JavaScript (Firefox 30-57), 48 octets
Port de la solution Python 2 de @ Dennis ♦.
la source
Japt ,
1413 octetsEssayez-le en ligne!
Déballé et comment cela fonctionne
Mise en œuvre simple.
la source
n2
:Í
APL (Dyalog Classic) , 9 octets
Essayez-le en ligne!
⎕
entrée évaluée(
)⍣⎕⊢0
appliquer la chose à(
)
plusieurs reprises, en commençant par0
,⍨
concaténer le résultat actuel avec lui-même⍋
indices d'une permutation tri-ascendantela source
x86, 31 octets
Prend un suffisamment grand
int[] buffer
ineax
et n inecx
, et renvoie le tampon danseax
.Implémente l'algorithme de concaténation donné dans l'instruction challenge. Il peut être possible d'économiser des octets en incrémentant les pointeurs de 4 au lieu d'utiliser directement les accès aux tableaux, mais
lea
/mov
est déjà assez court (3 octets pour 3 regs et un multiplicateur).Hexdump:
la source