Чтобы найти цифровую жесткость целого числа, возьмите его двоичное представление и посчитайте, сколько раз можно удалить как начальный, так и конечный
1
символы, пока он не начнется или не закончится знаком a0
. Общее количество удаленных бит - это его цифровая твердость.
Это довольно многословное объяснение - поэтому давайте разберем его с проработанным примером.
Для этого примера мы будем использовать число 3167. В двоичном виде это:
110001011111
(Обратите внимание, что во время преобразования в двоичный файл вы должны убрать начальные нули)
Он не начинается и не заканчивается 0
, поэтому мы удаляем 1 пару битов:
1 1000101111 1
И другой:
11 00010111 11
Но теперь в начале есть 0, поэтому мы не можем больше удалять 1
пары. Всего мы удалили 4 бита, и поэтому 4 - это цифровая жесткость 3167.
Однако для чисел, которые можно записать как 2 n -1 для положительного n (то есть содержать только 1
в двоичном представлении), 0 никогда не будет достигнуто, и поэтому все биты могут быть удалены. Это означает, что твердость - это просто длина целого бита.
Соревнование
Ваша задача - написать программу или функцию, которая, учитывая неотрицательное целое число n >= 0
, определяет его цифровую твердость.
Вы можете отправить полную программу, которая выполняет ввод / вывод, или функцию, которая возвращает результат. Ваше представление должно работать для значений в n
пределах стандартного целочисленного диапазона вашего языка.
Тестовые случаи
Пожалуйста, сообщите мне, если какой-либо из них является неправильным, или если вы хотите предложить какие-либо крайние случаи для добавления.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
Вот отличное решение Python, которое я использовал для генерации этих тестовых случаев (не гарантировано, что они не содержат ошибок):
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, когда0
в нем вообще нет? Я имею в виду, вы не можете удалить достаточно 1 из строки, чтобы она начала или заканчивалась0
.