S. Игра в «Угадайку»

Давайте сымитируем игру «Угадайка» между двумя людьми. Для этого нужно написать программу, которая отгадывает загаданное целое число от 1 до 1000 включительно.
Пользователь (или тестирующая система) загадывает число и не сообщает его вашей программе.
Угадать число нужно не более, чем за 10 попыток.

На каждую попытку пользователь отвечает одной из фраз:

  • Больше;
  • Меньше;
  • Угадал!

Данная задача проверяется интерактивно. Другими словами, пока вы не выведите своё число, система не предоставит вам данных.

Пример

Предположим, что было загадано число 123

Диалог вашей программы с пользователем/системой должен выглядеть так:

500
Меньше
250
Меньше
125
Меньше
63
Больше
94
Больше
109
Больше
117
Больше
121
Больше
123
Угадал!

Решение

В этой задаче мы знакомимся с алгоритмом бинарного (двоичного ) поиска.

Кратко суть алгоритма в следующем. Мы предполагаем число из середины интервала, если на говорят больше, мы называем число из середины правого, относительно нашего числа, интервала. Если число оказалось меньше – то из середины правого.
Повторяем этот процесс до тех пор, пока не найдем нужное число. Если алгоритм реализован правильно, то вам потребуется не более 10 попыток.

Приведено два решения задачи:
C использованием “дельты” – числа, отняв или прибавив которое можно получить следующую середину отрезка.
С использованием начала и конца отрезка.

Второе решение более распространено, первое выглядит более лаконично.

Обратите внимание, что во втором решении верхний диапазон сдвинут до 1001. Это нужно потому, что на последнем этапе при загаданном значении 1000 мы никогда не достигнем этого результата с помощью операции //, потому что (999 + 1000) // 2 всегда будет равно 999.

Посмотреть код

Решение

Python
number = 500
delta = number // 2
print(number)

while (answer := input()) != 'Угадал!':
    if answer == 'Меньше':
        number = number - delta
    if answer == 'Больше':
        number = number + delta
    if delta >= 2:
        delta = (delta + 1) // 2
    print(number)
    

Решение

Python
begin, end = 1, 1001
ask = (begin + end) // 2
print(ask)

while (answer := input()) != 'Угадал!':
    if answer == 'Меньше':
        end = (begin + end) // 2
    elif answer == 'Больше':
        begin = (begin + end) // 2
    ask = (begin + end) // 2
    print(ask)
    
Подписаться
Уведомить о
guest
3 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Виктор
Виктор
25.01.2024 11:46

Очень сильно хотел решить через рекурсию
трудности возникли когда загадывалось число 1000, помог Ваш сайт, спасибо

def recursiv(string, low, hight):
    q = (hight – low) // 2 + low
    print(q)
    s = input() 
    if s == ‘Угадал!’:
        return
    elif s == ‘Меньше’:
        recursiv(s, low, q)
    elif s == ‘Больше’:
        if q == 999:
            recursiv(s, q, hight + 1)
        else:
            recursiv(s, q, hight)

string = ”
low = 1
hight = 1001

recursiv(string, low, hight)

Павел
Павел
05.02.2024 14:06

Первое решение не удовлетворяет требованию 10 попыток, например, для числа 751.