Contexte
Le poids de Hamming d'un entier est le nombre d'unités dans sa représentation binaire. Pour ce défi, les entiers sont représentés avec 32 bits et ils ne sont pas signés.
Défi
Étant donné un entier compris entre 0 et 2 ^ 32-1 (non inclus), sortez un entier différent dans la même plage, et également avec le même poids de Hamming.
Exemples
Input (Decimal) | Input (Binary) | Hamming weight | Possible output (Decimal)
46 | 0b0010 1110 | 4 | 15
12 | 0b0000 1100 | 2 | 3
1 | 0b0000 0001 | 1 | 2
3 | 0b0000 0011 | 2 | 6
2^31 | 0b1000....0 | 1 | 1
2^31+2 | 0b1000...10 | 2 | 3
2^32-5 | 0b1111..011 | 31 | 2^31-1
2^32-2 | 0b1111....0 | 31 | 2^31-1
0 | 0b0000 0000 | 0 | None (This case need not be handled)
2^32-1 | 0b1111....1 | 32 | None (This case need not be handled)
Notation
C'est du code-golf , donc la solution dans le moins d'octets dans chaque langue l'emporte.
2^31+2
, je répète que j'ai dit un nombre impair . Les réponses en question seulement échoué lorsque les deux le plus haut et le bit le plus bas sont1
.Réponses:
assemblage x86-64,
54 octetsUne fonction utilisant la convention d'appel C qui tourne au niveau du bit son argument de 1 bit vers la gauche.
la source
n << 1 | n >> 31
aurol
lieu deror
(enregistrer un octet).Python, 20 octets
Rotation au niveau du bit à gauche de 1 bit.
la source
MATL , 9 octets
Décale circulairement la représentation binaire à 32 chiffres d'un pas vers la droite.
Essayez-le en ligne!
la source
Gelée ,
108 octetsÉchange le bit le moins significatif défini et non défini.
Essayez-le en ligne!
Comment ça marche
la source
JavaScript (ES6),
3531 octetsRecherche la première transition de bit (0 → 1 ou 1 → 0) et l'inverse.
Démo
Afficher l'extrait de code
Rotation des bits, 14 octets
Beaucoup plus court mais moins amusant.
Démo
Afficher l'extrait de code
la source
f(2147483647)
est-1073741825
et(n=>n>>>31|n<<1)(2147483647)
est-2
.k
est initialement défini surundefined
et nous profitons du fait que~undefined
égal-1
.Brain-Flak , 78 octets
Essayez-le en ligne!
Renvoie 2n si n <2 ^ 31 et 2n + 1-2 ^ 32 sinon. Malheureusement, parce que Brain-Flak n'a aucun moyen rapide de déterminer le signe d'un nombre, le programme expire sur TIO si l'entrée diffère de 2 ^ 31 de plus d'environ 500000.
Explication
Tout d'abord, poussez -2 ^ 32 sur la pile:
Ensuite, calculez la sortie souhaitée:
la source
dc, 10
Essayez-le en ligne .
Il s'agit d'une implémentation arithmétique d'une rotation à droite de 32 bits:
la source
Java 8,
1171729 octets+12 octets en passant
int
àlong
, carint
la taille maximale de2³¹-1
10089 octets enregistrés en créant un port de la réponse Python étonnante de @AndersKaseorg .Essayez-le ici.
Les sorties:
Ancienne réponse (
117118 octets):+1 octet en changeant
int
enlong
, carint
la taille maximale de2³¹-1
Essayez-le ici.
Les sorties:
la source
Mathematica, 29 octets
Essayez-le au bac à sable Wolfram
Rotation arithmétique vers la gauche: multipliez d'abord par 2, ce qui peut éventuellement déplacer le nombre hors de la plage, puis coupez le chiffre hors de la plage avec
Mod[...,2^32]
et ajoutez-le à droite avec+Quotient[...,2^32]
.(Mathematica a un seul module intégré qui donne le module et le quotient en une seule fois, mais ça l'est
QuotientRemainder
, ce qui est un peu un handicap au golf…)la source
APL, 12 octets
Comment?
la source
05AB1E , 5 octets
Essayez-le en ligne!
Explication
Utilise l'astuce pour faire pivoter la représentation binaire laissée de 1 bit à partir de la réponse python d' Anders Kaseorg .
la source
R,
4263 octetsMélange les bits au hasard, mais vérifie qu'il ne retourne pas le même nombre par hasard.
la source
Espace ,
8180 octets(1 octet sauvé grâce à @ Ørjan Johansen me rappelant que dup est plus court que push 0)
Essayez-le en ligne!
Implémente fondamentalement un décalage cyclique vers la droite en utilisant l'arithmétique entière. Pousser une grande constante coûte cher dans l'espace blanc, donc nous économisons quelques octets en poussant 2 ^ 8 et en la quadrillant deux fois. (Enregistre 1 octet de plus (2 ^ 16) ^ 2 et 10 octets de plus en poussant directement 2 ^ 32.)
Explication
la source
push 0
par unedup
commande plus tôt.Python 2.7, 89 octets
Programme complet:
Essayez-le en ligne!
Bienvenue suggestions! :)
la source
Pari / GP , 15 octets
Essayez-le en ligne!
la source
Japt , 5 octets
Rotation au niveau du bit, comme la plupart des réponses ici.
Essayez-le
la source
Perl 5
-p
, 39 octetsEssayez-le en ligne!
la source
Python 3 , 45 octets
Essayez-le en ligne!
la source
C ++ (gcc) ,
4539 octets-6 octets merci au plafond
Essayez-le en ligne!
la source