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

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

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

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

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

Пример

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

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

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

Решение

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

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

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

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

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

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

Решение

Python
current_guess = 500
step = current_guess // 2
print(current_guess)

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

Решение

Python
low, high = 1, 1001

guess = (low + high) // 2
print(guess)

while (response := input()) != "Угадал!":
    if response == "Меньше":
        high = guess
    elif response == "Больше":
        low = guess
    guess = (low + high) // 2
    print(guess)
Подписаться
Уведомить о
guest
13 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Виктор
Виктор
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.

Ann
Ann
08.10.2025 15:55

Большое спасибо за подсказку. А зачем к дельте прибавлять 1 при ее делении на 2? Опытным путем установила, что если не прибавить 1, то 10 попыток не хватит. А теоретическое обоснование есть?

Ильгиз
Ильгиз
31.10.2025 11:10

Доброго времени суток!) Первое решение не может найти число 1. Первое решение будет работать только если в переменной number будет число 501, как во втором решении, но в этом случае он не может найти число 1000, будет 1001)

Последний раз редактировалось 1 месяц назад Ильгиз ем
Ильгиз
Ильгиз
Ответить на  Сергей Клочко
31.10.2025 15:47

По второму решению всё получается как вы и описали)
А по первому решению получается так:

annotacziya-2025-10-31-154625
Последний раз редактировалось 1 месяц назад Ильгиз ем
Дмитрий
Дмитрий
16.11.2025 14:30

str1 = «Угадал!»
str2 = «Меньше»
str3 = «Больше»

a = 0
b = 1001
c = 500

user_string = «»

print(c)
while user_string != str1:
    user_string = str(input())

    if user_string == str2:
        b = c
        c = c — ((b — a) // 2)
        print(int(c))

    elif user_string == str3:
        a = c
        c = c + ((b — a) // 2)
        print(int(c))

Дмитрий
Дмитрий
16.11.2025 14:32

Здравствуйте! Вот такое решение чекер пропустил.

Олег
Олег
02.12.2025 09:40

И чем же второе решение отличается от первого, кроме имён переменных? (и замены = на +=)