So finden Sie die digitale Härte einer ganzen Zahl, nehmen seine binäre Darstellung und zählen die Anzahl der Zeiten sowohl eine führende und nachlauf
1
kann entfernt werden , bis sie entweder mit einem Start oder Enden0
. Die Gesamtzahl der entfernten Bits ist die digitale Härte.
Das ist eine ziemlich wortreiche Erklärung - also lasst es uns mit einem ausgearbeiteten Beispiel aufschlüsseln.
In diesem Beispiel verwenden wir die Nummer 3167. In der Binärdatei ist dies:
110001011111
(Beachten Sie, dass Sie bei der Konvertierung in eine Binärdatei sicherstellen sollten, dass führende Nullen entfernt werden.)
Es beginnt oder endet nicht mit 0
, also entfernen wir 1 Paar Bits:
1 1000101111 1
Und ein anderer:
11 00010111 11
Aber jetzt gibt es eine 0 am Anfang, so dass wir keine 1
Paare mehr entfernen können . Insgesamt haben wir 4 Bits entfernt, also 4 die digitale Härte von 3167.
Für Zahlen, die als 2 n -1 für positives n geschrieben werden können (dh nur enthalten)1
in binärer Darstellung enthalten), wird 0 jedoch niemals erreicht, und so können alle Bits entfernt werden. Dies bedeutet, dass die Härte einfach die Bitlänge der ganzen Zahl ist.
Die Herausforderung
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die eine nicht negative ganze Zahl enthält n >= 0
die digitale Härte bestimmt.
Sie können ein vollständiges Programm einreichen, das E / A ausführt, oder eine Funktion, die das Ergebnis zurückgibt. Ihre Eingabe sollte für Werte von "" funktionierenn
innerhalb des ganzzahligen Standardbereichs Ihrer Sprache .
Testfälle
Bitte benachrichtigen Sie mich, wenn eine dieser Angaben nicht korrekt ist oder wenn Sie Randfälle vorschlagen möchten, die hinzugefügt werden sollen.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
Hier ist die ungolfed Python-Lösung, mit der ich diese Testfälle generiert habe (ohne Gewähr, dass sie fehlerfrei sind):
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
1 zurückgegeben, wenn überhaupt nichts enthalten ist0
? Ich meine, Sie können unmöglich genug Einsen aus der Zeichenkette entfernen, um den Anfang oder das Ende zu haben0
.