Fondo
El peso de Hamming de un entero es el número de unos en su representación binaria. Para este desafío, los enteros se representan con 32 bits y no están firmados.
Reto
Dado un número entero entre 0 y 2 ^ 32-1 (no incluido), genera un número entero diferente dentro del mismo rango y también con el mismo peso de Hamming.
Ejemplos
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)
Tanteo
Este es el código de golf , por lo que gana la solución en la menor cantidad de bytes en cada idioma.
2^31+2
, repetiré que dije un número impar . Las respuestas en cuestión solo fallaron cuando tanto el bit más alto como el más bajo son1
.Respuestas:
Ensamblado x86-64,
54 bytesUna función que utiliza la convención de llamada C que gira a nivel de bits su argumento a la izquierda en 1 bit.
fuente
n << 1 | n >> 31
enrol
lugar deror
(guardar un byte).Python, 20 bytes
Rotación bit a la izquierda por 1 bit.
fuente
MATL , 9 bytes
Desplaza circularmente la representación binaria de 32 dígitos un paso hacia la derecha.
Pruébalo en línea!
fuente
Jalea ,
108 bytesIntercambia el bit menos definido y menos definido.
Pruébalo en línea!
Cómo funciona
fuente
JavaScript (ES6),
3531 bytesBusca la transición del primer bit (0 → 1 o 1 → 0) y la invierte.
Manifestación
Mostrar fragmento de código
Rotación de bits, 14 bytes.
Mucho más corto pero menos divertido.
Manifestación
Mostrar fragmento de código
fuente
f(2147483647)
es-1073741825
y(n=>n>>>31|n<<1)(2147483647)
es-2
.k
se establece inicialmente enundefined
y aprovechamos el hecho de que~undefined
es igual-1
.Brain-Flak , 78 bytes
Pruébalo en línea!
Devuelve 2n si n <2 ^ 31, y 2n + 1-2 ^ 32 de lo contrario. Desafortunadamente, debido a que Brain-Flak no tiene una forma rápida de determinar el signo de un número, el programa agota el tiempo de espera en TIO si la entrada difiere de 2 ^ 31 en más de aproximadamente 500000.
Explicación
Primero, empuja -2 ^ 32 en la pila:
Luego, calcule la salida deseada:
fuente
dc, 10
Pruébalo en línea .
Esta es una implementación aritmética de un giro a la derecha de 32 bits:
fuente
Java 8,
1171729 bytes+12 bytes cambiando
int
along
, porqueint
el tamaño máximo es2³¹-1
10089 bytes guardados al crear un puerto de la sorprendente respuesta Python de @AndersKaseorg .Pruébalo aquí
Salidas:
Respuesta anterior (
117118 bytes):+1 byte cambiando
int
along
, porqueint
el tamaño máximo es2³¹-1
Pruébalo aquí
Salidas:
fuente
Mathematica, 29 bytes
Pruébalo en el sandbox de Wolfram
Rota a la izquierda aritméticamente: primero multiplique por 2, lo que posiblemente desplace el número fuera del rango, luego corte el dígito fuera del rango con
Mod[...,2^32]
y agréguelo nuevamente a la derecha con+Quotient[...,2^32]
.(Mathematica tiene una sola construcción que da el módulo y el cociente de una vez, pero es
QuotientRemainder
, que es un poco una desventaja para el golf ...)fuente
APL, 12 bytes
¿Cómo?
fuente
05AB1E , 5 bytes
Pruébalo en línea!
Explicación
Utiliza el truco para rotar la representación binaria que queda 1 bit de la respuesta de Python de Anders Kaseorg .
fuente
R,
4263 bytesMezcla los bits aleatoriamente, pero se asegura de que no haya devuelto el mismo número por casualidad.
fuente
Espacios en blanco ,
8180 bytes(1 byte guardado gracias a @ Ørjan Johansen que me recuerda que dup es más corto que push 0)
Pruébalo en línea!
Básicamente implementa un desplazamiento de bits a la derecha cíclico utilizando aritmética de enteros. Empujar una constante grande es costoso en espacios en blanco, por lo que ahorramos algunos bytes presionando 2 ^ 8 y cuadrándolo dos veces. (Ahorra 1 byte sobre (2 ^ 16) ^ 2 y 10 bytes sobre empujando 2 ^ 32 directamente.)
Explicación
fuente
push 0
con undup
comando anterior.Python 2.7, 89 bytes
Programa completo:
Pruébalo en línea!
Sugerencias bienvenidas! :)
fuente
Pari / GP , 15 bytes
Pruébalo en línea!
fuente
Japt , 5 bytes
Rotación bit a bit, como la mayoría de las respuestas aquí.
Intentalo
fuente
Perl 5
-p
, 39 bytesPruébalo en línea!
fuente
Python 3 , 45 bytes
Pruébalo en línea!
fuente
C ++ (gcc) ,
4539 bytes-6 bytes gracias al techo
Pruébalo en línea!
fuente