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
1
peuvent ê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 1
paires. 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 1
dans 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 n
dans 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
1
retourne 1 quand il n'y0
en 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
.