Per trovare la durezza digitale di un numero intero, prendere la sua rappresentazione binaria, e contare il numero di volte sia un leader e posteriore
1
può essere rimosso fino a quando non sia avviato o termina con0
. Il numero totale di bit rimossi è la sua durezza digitale.
Questa è una spiegazione piuttosto prolissa, quindi analizziamola con un esempio funzionante.
Per questo esempio, useremo il numero 3167. In binario, questo è:
110001011111
(Si noti che, durante la conversione in binario, è necessario assicurarsi di eliminare gli zero iniziali)
Non inizia o termina con 0
, quindi rimuoviamo 1 coppia di bit:
1 1000101111 1
E un altro:
11 00010111 11
Ma ora c'è uno 0 all'inizio, quindi non possiamo rimuovere più 1
coppie. In totale, abbiamo rimosso 4 bit, quindi 4 è la durezza digitale di 3167.
Tuttavia, per i numeri che possono essere scritti come 2 n -1 per n positivo (cioè contengono solo 1
in rappresentazione binaria), non verrà mai raggiunto 0 e quindi tutti i bit possono essere rimossi. Ciò significa che la durezza è semplicemente la lunghezza in bit dell'intero.
La sfida
Il tuo compito è quello di scrivere un programma o una funzione che, dato un numero intero non negativo n >= 0
, determina la sua durezza digitale.
È possibile inviare un programma completo che esegue I / O o una funzione che restituisce il risultato. Il tuo invio dovrebbe funzionare per valori n
compresi nell'intervallo intero standard della tua lingua.
Casi test
Si prega di avvisare se qualcuno di questi è errato o se si desidera suggerire eventuali casi limite da aggiungere.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
Ecco la soluzione ungolfed di Python che ho usato per generare questi casi di test (non garantito che sia privo di 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
restituisce 1 quando non ce n'è in alcun0
modo? Voglio dire, non è possibile rimuovere abbastanza 1 dalla stringa per farla iniziare o finire0
.