Para encontrar a dureza digital de um número inteiro, obtenha sua representação binária e conte o número de vezes que uma guia inicial e uma final
1
podem ser removidas até que iniciem ou terminem com a0
. O número total de bits removidos é a sua dureza digital.
Essa é uma explicação bastante prolixo - então vamos detalhar com um exemplo bem trabalhado.
Neste exemplo, usaremos o número 3167. Em binário, é o seguinte:
110001011111
(Observe que, durante a conversão para binário, retire os zeros iniciais)
Como não começa nem termina 0
, removemos 1 par de bits:
1 1000101111 1
E outro:
11 00010111 11
Mas agora há um 0 no começo, então não podemos remover mais 1
pares. No total, removemos 4 bits e, portanto, 4 é a dureza digital de 3167.
No entanto, para números que podem ser escritos como 2 n -1 para n positivo (ou seja, contêm apenas 1
na representação binária), 0 nunca será alcançado e, portanto, todos os bits poderão ser removidos. Isso significa que a dureza é simplesmente o tamanho do bit do número inteiro.
O desafio
n >= 0
Sua tarefa é escrever um programa ou função que, dado um número inteiro não negativo , determine sua dureza digital.
Você pode enviar um programa completo que execute E / S ou uma função que retorne o resultado. Seu envio deve funcionar com valores n
dentro do intervalo inteiro padrão do seu idioma.
Casos de teste
Notifique-me se algum deles estiver incorreto ou se você gostaria de sugerir algum caso extremo a ser adicionado.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
Aqui está a solução Python não utilizada que eu usei para gerar esses casos de teste (não é garantido que não haja erros):
def hardness(num) -> int:
binary = bin(num)[2:]
if binary.count('0') == 0:
return num.bit_length()
revbin = binary[::-1]
return min(revbin.find('0'), binary.find('0')) * 2
1
retorna 1 quando não há nenhum0
? Quero dizer, você não pode remover 1s suficientes da string para que ela comece ou termine0
.