Dato un input di un numero intero positivo, emettere il numero di passaggi necessari per trovare l'input tramite una ricerca binaria a partire da 1.
Stiamo simulando una ricerca binaria per l'intero che è stato fornito come input, in cui il ricercatore simulato può indovinare ripetutamente un numero intero e sapere se è troppo alto, troppo basso o corretto. La strategia per trovare il numero intero è la seguente:
Sia n il numero intero indicato come input che stiamo cercando di trovare.
Inizia con un'ipotesi di 1. (Per ogni ipotesi, incrementa il numero di passaggi (indipendentemente dal fatto che fosse corretto o meno), e ferma immediatamente e genera il numero totale di passaggi se l'ipotesi era corretta.)
Raddoppia più volte l'ipotesi fino a quando l'ipotesi è maggiore di n (il numero di destinazione). (O se è corretto, ma è già coperto dalla nostra regola di ipotesi corretta sopra menzionata.)
Ora, imposta un limite superiore della prima potenza di 2 che è maggiore di n (cioè il numero appena indovinato) e imposta un limite inferiore della potenza di 2 direttamente sotto di esso.
Indovina ripetutamente la media (arrotondata per difetto) del limite superiore e del limite inferiore. Se è troppo alto, impostalo come limite superiore. Se è troppo basso, impostarlo come limite inferiore. Questa procedura è garantita per provocare eventualmente un'ipotesi corretta.
Ecco un esempio, per l'input di n = 21:
1 -> 2 -> 4 -> 8 -> 16 -> 32 -> 24 -> 20 -> 22 -> 21
\__________________________/
repeated doubling \________________________/
repeated averaging
Poiché si tratta di code-golf , vincerà il codice più breve in byte.
Ecco tutti gli output da n = 1 a 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
E qui ci sono alcuni casi di test più grandi:
1234 -> 21
1337 -> 22
3808 -> 19
12345 -> 28
32768 -> 16
32769 -> 32
50000 -> 28