Pour trouver la dureté numérique d'un entier, prenez sa représentation binaire et comptez le nombre de fois où un début et un retour
1peuvent être supprimés jusqu'à ce qu'il commence ou se termine par a0. Le nombre total de bits supprimés est sa dureté numérique.
C'est une explication assez verbeuse - alors décomposons-la avec un exemple concret.
Pour cet exemple, nous utiliserons le nombre 3167. En binaire, c'est:
110001011111
(Notez que, lors de la conversion en binaire, vous devez vous assurer de supprimer les zéros non significatifs)
Il ne commence ni ne se termine par 0, nous supprimons donc 1 paire de bits:
1 1000101111 1
Et un autre:
11 00010111 11
Mais maintenant, il y a un 0 au début, donc nous ne pouvons plus supprimer de 1paires. Au total, 4 bits que nous avons supprimés, et donc 4 est la dureté numérique de 3167.
Cependant, pour les nombres qui peuvent être écrits comme 2 n -1 pour n positif (c'est-à-dire qu'ils ne contiennent que 1dans une représentation binaire), 0 ne sera jamais atteint, et donc tous les bits peuvent être supprimés. Cela signifie que la dureté est simplement la longueur de bits de l'entier.
Le défi
Votre tâche consiste à écrire un programme ou une fonction qui, étant donné un entier non négatif n >= 0, détermine sa dureté numérique.
Vous pouvez soumettre un programme complet qui effectue des E / S, ou une fonction qui renvoie le résultat. Votre soumission doit fonctionner pour des valeurs comprises ndans la plage d'entiers standard de votre langue.
Cas de test
Veuillez m'informer si l'une de ces erreurs est incorrecte ou si vous souhaitez suggérer des cas supplémentaires à ajouter.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
Voici la solution Python non golfée que j'ai utilisée pour générer ces cas de test (non garantis sans bug):
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
1retourne 1 quand il n'y0en a pas du tout? Je veux dire, vous ne pouvez pas supprimer suffisamment de 1 de la chaîne pour que cela commence ou se termine0.