Bulmak için dijital sertlik , bir tam sayı, bunun ikili gösterimini almak ve kez sayısını hem lider ve arka
1
bu başlamak ya da bir ile sona erene kadar çıkarılabilir0
. Çıkarılan toplam bit sayısı, dijital sertliğidir.
Bu oldukça endişe verici bir açıklama - öyleyse çalışmış bir örnekle parçalayalım.
Bu örnek için, 3167 sayısını kullanacağız. İkilik olarak, bu:
110001011111
(İkili dosyaya dönüştürme sırasında baştaki sıfırları sıyrtığınızdan emin olmanız gerekir)
Başlamaz veya bitmez 0
, bu yüzden 1 bit bit kaldırırız:
1 1000101111 1
Ve başka:
11 00010111 11
Ama şimdi başlangıçta 0 var, bu yüzden artık 1
çiftleri kaldıramıyoruz . Toplamda 4 bit çıkardık ve bu yüzden 4 3167'nin dijital sertliği .
Bununla birlikte, pozitif n için 2 n -1 olarak yazılabilecek sayılar için (yani sadece ikili gösterimi içerir), 0'a asla erişilmez ve böylece tüm bitler kaldırılabilir. Bu, sertliğin basitçe tamsayının bit uzunluğu olduğu anlamına gelir.1
Meydan okuma
Göreviniz, negatif olmayan bir tamsayı verildiğinde n >= 0
dijital sertliğini belirleyen bir program veya işlev yazmaktır .
G / Ç gerçekleştiren tam bir program veya sonucu veren bir işlev gönderebilirsiniz. Gönderiniz n
, dilinizin standart tamsayı aralığında değerler için çalışmalıdır .
Test Kılıfları
Bunlardan herhangi biri yanlışsa veya eklenecek herhangi bir son durumu önermek isterseniz lütfen bana bildirin.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
İşte bu test senaryolarını oluşturmak için kullandığım ungolfed Python çözümü:
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
hiç olmadığı zaman 1'i nasıl döndürür0
? Demek istediğim, dizgeden başlaması veya bitmesi için yeterince 1'i kaldıramazsınız0
.