fundo
O peso de Hamming de um número inteiro é o número de unidades em sua representação binária. Para esse desafio, os números inteiros são representados com 32 bits e não são assinados.
Desafio
Dado um número inteiro entre 0 e 2 ^ 32-1 (não inclusivo), produza um número inteiro diferente dentro do mesmo intervalo e também com o mesmo peso de Hamming.
Exemplos
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)
Pontuação
Isso é código-golfe , então a solução com o menor número de bytes em cada idioma vence.
2^31+2
, repetirei que disse um número ímpar . As respostas em questão só falhou quando tanto o maior e o menor bit são1
.Respostas:
montagem x86-64,
54 bytesUma função que usa a convenção de chamada C que gira bit a bit seu argumento deixado em 1 bit.
fonte
n << 1 | n >> 31
emrol
vez deror
(salvar um byte).Python, 20 bytes
Rotação bit a bit deixada em 1 bit.
fonte
MATL , 9 bytes
Desloca circularmente a representação binária de 32 dígitos um passo para a direita.
Experimente online!
fonte
Geléia ,
108 bytesTroca o conjunto menos significativo e o bit não definido.
Experimente online!
Como funciona
fonte
JavaScript (ES6),
3531 bytesProcura a primeira transição de bits (0 → 1 ou 1 → 0) e a inverte.
Demo
Mostrar snippet de código
Rotação de bits, 14 bytes
Muito mais curto, mas menos divertido.
Demo
Mostrar snippet de código
fonte
f(2147483647)
é-1073741825
e(n=>n>>>31|n<<1)(2147483647)
é-2
.k
é definido inicialmente comoundefined
e aproveitamos o fato de que~undefined
é igual a-1
.Brain-Flak , 78 bytes
Experimente online!
Retorna 2n se n <2 ^ 31 e 2n + 1-2 ^ 32 caso contrário. Infelizmente, como o Brain-Flak não possui uma maneira rápida de determinar o sinal de um número, o programa atinge o tempo limite no TIO se a entrada diferir de 2 ^ 31 em mais de 500000.
Explicação
Primeiro, pressione -2 ^ 32 na pilha:
Em seguida, calcule a saída desejada:
fonte
dc, 10
Experimente online .
Esta é uma implementação aritmética de uma rotação de 32 bits à direita:
fonte
Java 8,
1171729 bytes+12 bytes, alterando
int
paralong
, porqueint
o tamanho máximo é2³¹-1
10089 bytes salvos criando uma porta de incrível resposta Python @AndersKaseorg .Experimente aqui.
Saídas:
Resposta antiga (
117118 bytes):+1 byte, alterando
int
paralong
, porqueint
o tamanho máximo é2³¹-1
Experimente aqui.
Saídas:
fonte
Mathematica, 29 bytes
Experimente na sandbox Wolfram
Gira à esquerda aritmeticamente: primeiro multiplique por 2, o que possivelmente altera o número fora da faixa, depois corte o dígito fora da faixa
Mod[...,2^32]
e adicione-o novamente à direita com+Quotient[...,2^32]
.(O Mathematica tem um único componente que fornece o módulo e o quociente de uma só vez, mas é
QuotientRemainder
, o que é um pouco um obstáculo para o golfe ...)fonte
APL, 12 bytes
Quão?
fonte
05AB1E , 5 bytes
Experimente online!
Explicação
Usa o truque para girar a representação binária deixada em 1 bit da resposta python de Anders Kaseorg .
fonte
R,
42bytes 63Baralha aleatoriamente os bits, mas verifica se não retornou o mesmo número por acaso.
fonte
Espaço em branco ,
8180 bytes(1 byte salvo graças a @ Ørjan Johansen, lembrando-me que o dup é menor que o push 0)
Experimente online!
Implementa basicamente um deslocamento de bits cíclico à direita usando aritmética inteira. Pressionar uma constante grande é caro no espaço em branco, por isso economizamos alguns bytes pressionando 2 ^ 8 e quadrando-o duas vezes. (Salva 1 byte acima (2 ^ 16) ^ 2 e 10 bytes pressionando 2 ^ 32 diretamente.)
Explicação
fonte
push 0
pordup
um comando anterior.Python 2.7, 89 bytes
Programa completo:
Experimente online!
Sugestões são bem-vindas! :)
fonte
Pari / GP , 15 bytes
Experimente online!
fonte
Japt , 5 bytes
Rotação bit a bit, como a maioria das respostas aqui.
Tente
fonte
Perl 5
-p
, 39 bytesExperimente online!
fonte
Python 3 , 45 bytes
Experimente online!
fonte
C ++ (gcc) ,
4539 bytes-6 bytes thanx em tetocat
Experimente online!
fonte