Para encontrar la dureza digitales de un entero, tome su representación binaria, y contar el número de veces que tanto uno de los principales y de arrastre
1
puede ser retirado hasta que o bien se inicia o termina con una0
. El número total de bits eliminados es su dureza digital.
Esa es una explicación bastante prolija, así que analicemos con un ejemplo trabajado.
Para este ejemplo, usaremos el número 3167. En binario, esto es:
110001011111
(Tenga en cuenta que, durante la conversión a binario, debe asegurarse de eliminar los ceros iniciales)
No comienza ni termina con 0
, por lo que eliminamos 1 par de bits:
1 1000101111 1
Y otro:
11 00010111 11
Pero ahora hay un 0 al principio, por lo que no podemos eliminar más 1
pares. En total, eliminamos 4 bits, por lo que 4 es la dureza digital de 3167.
Sin embargo, para los números que pueden escribirse como 2 n -1 para n positivo (es decir, contener solo 1
en representación binaria), nunca se alcanzará 0, por lo que todos los bits se pueden eliminar. Esto significa que la dureza es simplemente la longitud de bits del entero.
El reto
Su tarea es escribir un programa o función que, dado un número entero no negativo n >= 0
, determine su dureza digital.
Puede enviar un programa completo que realice E / S o una función que devuelva el resultado. Su envío debe funcionar para valores n
dentro del rango entero estándar de su idioma.
Casos de prueba
Notifíqueme si alguno de estos es incorrecto o si desea sugerir algún caso marginal para agregar.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
Aquí está la solución de Python sin golf que utilicé para generar estos casos de prueba (no se garantiza que no tengan errores):
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
devuelve 1 cuando no hay0
en absoluto? Quiero decir, no puedes eliminar suficientes 1 de la cadena para que comience o termine0
.