хочу наоборот: я загадал число, а комп угадывает. как?
Сделал обычную «угадай число», теперь хочу прикольную версию: я загадываю число от 1 до 100 в голове, а комп угадывает и спрашивает «больше/меньше/угадал». Не понимаю как комп должен соображать, не перебирать же все числа подряд? Это же тупо будет.
2 ответа
Перебирать всё подряд и правда тупо. Хитрость в том, чтобы комп каждый раз называл середину диапазона — так он отрезает половину вариантов за раз (это называется бинарный поиск, но по-простому — деление пополам). Вот:
low = 1
high = 100
print("Загадай число от 1 до 100, я угадаю!")
input("Загадал? Нажми Enter...")
while True:
guess = (low + high) // 2
answer = input(f"Твоё число {guess}? (б — больше, м — меньше, у — угадал): ")
if answer == "у":
print("Ха, я знал!")
break
elif answer == "б":
low = guess + 1
elif answer == "м":
high = guess - 1
Как работает: guess — это середина между low и high. Если ты говоришь «больше» — значит число в верхней половине, и комп поднимает нижнюю границу low. Если «меньше» — опускает high. Диапазон каждый раз сужается вдвое, поэтому любое число до 100 угадывается максимум за 7 шагов!
Как улучшить: посчитай попытки и в конце выведи «угадал за N вопросов» — друзья офигеют, что так быстро.
Прикольно, что комп всегда побеждает за 7 шагов максимум. Можешь ещё добавить защиту от вранья: если low > high — значит ты где-то соврал, и комп ловит тебя:
if low > high:
print("Ты меня обманываешь :)")
break