入力が正の整数の場合、1から始まるバイナリ検索で入力を見つけるために必要なステップ数を出力します。
入力として与えられた整数のバイナリ検索をシミュレートします。シミュレートされたサーチャーは整数を繰り返し推測し、整数が高すぎる、低すぎる、または正しいかどうかを確認できます。整数を見つけるための戦略は次のとおりです。
nを、検索しようとしている入力として与えられた整数とします。
1の推測から開始します(推測ごとに(正しいかどうかに関係なく)ステップ数を増やし、推測が正しい場合は直ちにステップの合計数を停止して出力します。)
推測がn(ターゲット数)よりも大きくなるまで繰り返し推測を繰り返します。(または、それが正しい場合でも、上記の正しい推測ルールで既にカバーされています。)
ここで、n(つまり、推測された数)よりも大きい2の最初の累乗の上限を設定し、その直下に2の累乗の下限を設定します。
上限と下限の平均(切り捨て)を繰り返し推測します。高すぎる場合は、上限として設定します。低すぎる場合は、下限として設定します。この手順により、最終的に正しい推測が行われることが保証されます。
n = 21の入力の例を次に示します。
1 -> 2 -> 4 -> 8 -> 16 -> 32 -> 24 -> 20 -> 22 -> 21
\__________________________/
repeated doubling \________________________/
repeated averaging
これはcode-golfであるため、バイト単位の最短コードが優先されます。
以下は、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