Если задано положительное целое число, выведите количество шагов, необходимых для поиска ввода с помощью двоичного поиска, начиная с 1.
Мы моделируем двоичный поиск целого числа, которое было задано в качестве входных данных, в котором смоделированный искатель может многократно угадывать целое число и сообщать, является ли оно слишком высоким, слишком низким или правильным. Стратегия нахождения целого числа следующая:
Позвольте n быть целым числом, данным как входные данные, которые мы пытаемся найти.
Начните с предположения 1. (Для каждого предположения увеличьте количество шагов (независимо от того, было ли оно правильным или нет), и немедленно остановите и выведите общее количество шагов, если предположение было правильным.)
Повторяйте двойное предположение, пока оно не станет больше n (целевого числа). (Или, если это правильно, но это уже охватывается нашим правилом правильного угадывания, упомянутым выше.)
Теперь установите верхнюю границу первой степени 2, которая больше, чем n (т.е. число, которое только что угадано), и установите нижнюю границу степени 2 непосредственно под ней.
Повторно угадать среднее (округленное вниз) верхней границы и нижней границы. Если оно слишком высокое, установите его в качестве верхней границы. Если он слишком низкий, установите его в качестве нижней границы. Эта процедура гарантированно приведет к правильному предположению.
Вот пример для ввода n = 21:
1 -> 2 -> 4 -> 8 -> 16 -> 32 -> 24 -> 20 -> 22 -> 21
\__________________________/
repeated doubling \________________________/
repeated averaging
Поскольку это код-гольф , победит самый короткий код в байтах.
Вот все выходы от n = 1 до n = 100:
1
2
4
3
6
5
6
4
8
7
8
6
8
7
8
5
10
9
10
8
10
9
10
7
10
9
10
8
10
9
10
6
12
11
12
10
12
11
12
9
12
11
12
10
12
11
12
8
12
11
12
10
12
11
12
9
12
11
12
10
12
11
12
7
14
13
14
12
14
13
14
11
14
13
14
12
14
13
14
10
14
13
14
12
14
13
14
11
14
13
14
12
14
13
14
9
14
13
14
12
И вот несколько больших тестовых случаев:
1234 -> 21
1337 -> 22
3808 -> 19
12345 -> 28
32768 -> 16
32769 -> 32
50000 -> 28