Untuk menemukan kekerasan digital dari sebuah bilangan bulat, ambil representasi binernya, dan hitung berapa kali sebuah leading dan trailing
1
dapat dihilangkan sampai ia memulai atau diakhiri dengan a0
. Jumlah total bit yang dihapus adalah kekerasan digitalnya.
Itu penjelasan yang cukup bertele-tele - jadi mari kita uraikan dengan contoh yang berhasil.
Untuk contoh ini, kita akan menggunakan nomor 3167. Dalam biner, ini adalah:
110001011111
(Perhatikan bahwa, selama konversi ke biner, Anda harus memastikan untuk menghapus nol di depan)
Itu tidak dimulai atau diakhiri dengan 0
, jadi kami menghapus 1 pasang bit:
1 1000101111 1
Dan satu lagi:
11 00010111 11
Tapi sekarang ada 0 di awal, jadi kami tidak bisa menghapus 1
pasangan lagi . Secara total, 4 bit kami lepaskan, dan 4 adalah kekerasan digital 3167.
Namun, untuk angka yang dapat ditulis sebagai 2 n -1 untuk n positif (yaitu hanya berisi 1
dalam representasi biner), 0 tidak akan pernah tercapai, dan dengan demikian semua bit dapat dihapus. Ini berarti bahwa kekerasan hanyalah panjang bit bilangan bulat.
Tantangan
Tugas Anda adalah menulis program atau fungsi yang, diberi bilangan bulat non-negatif n >= 0
, menentukan kekerasan digitalnya.
Anda dapat mengirimkan program lengkap yang menjalankan I / O, atau fungsi yang mengembalikan hasilnya. Kiriman Anda harus berfungsi untuk nilai-nilai n
dalam rentang integer standar bahasa Anda.
Uji Kasus
Harap beri tahu saya jika ada yang salah, atau jika Anda ingin menyarankan case edge untuk ditambahkan.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
Inilah solusi Python yang tidak diklik yang saya gunakan untuk menghasilkan kasus uji ini (tidak dijamin bug-kurang):
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
mengembalikan 1 ketika tidak ada0
di dalamnya sama sekali? Maksud saya, Anda tidak dapat menghapus cukup 1 dari string untuk memulai atau mengakhiri0
.