Как можно оптимизировать код при решении задачи, угадай число
Всем привет. Пытаюсь решить задачу угадай число. Подскажите, можно ли улучшить код в задаче угадай число, в частности в блоке if. Я только начал изучать Pytnon.
number = 37 count = 0 while count < 5: your_num = int(input('Введите число от 1 до 100: ')) count += 1 if your_num == number: if count == 1: print(f'Вы угадали число за попытку. Спасибо за игру!') if 1 < count < 5: print(f'Вы угадали число за попытки. Спасибо за игру!') if count == 5: print(f'Вы угадали число за попыток. Спасибо за игру!') break elif your_num < number: print('Ваше число меньше загаданного числа, попробуйте ещё раз.') elif your_num >number: print('Ваше число больше загаданного числа, попробуйте ещё раз.') continue
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 15 фев 2022 в 2:01
1 1 1 бронзовый знак
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Конечно можно, в моей реализации я бы использовал следующую конструкцию
import random ATTEMPTS_COUNT = 5 # Количество попыток MIN_GUESS_NUMBER = 1 # Минимально возможное число MAX_GUESS_NUMBER = 100 # Максимально возможное число GUESS_NUMBER = random.randrange(MIN_GUESS_NUMBER, MAX_GUESS_NUMBER) # Загадываем число for attempt in range(ATTEMPTS_COUNT): number = int(input(f'Введите число от до : ')) if number < GUESS_NUMBER: print('Ваше число меньше загаданного числа, попробуйте ещё раз.') elif number >GUESS_NUMBER: print('Ваше число больше загаданного числа, попробуйте ещё раз.') elif number == GUESS_NUMBER: print(f'Вы угадали число за попыт(ку/ок), спасибо за игру!') break
Угадать число от 0 до 100 за 7 попыток — математический трюк
Математический фокус, который способен удивить. Объясним алгоритм и напишем на Java простенькую программу для решения.
Этот математический фокус не так сложен, как может показаться на первый взгляд. Более того, решение мы реализуем программно на языке Java. Приступим?
Условие
Если расписать весь процесс поэтапно, выглядит это следующим образом:
- Вы загадываете число от 0 до 100.
- Программа выводит целое число в рамках данного диапазона.
- Вы отвечаете, ваше число больше, меньше или равно тому, что вывела программа.
- Если число больше либо меньше, программа продолжает предлагать варианты.
- За 7 или менее попыток число гарантированно угадывается.
Решение
На самом деле, никакого особого секрета здесь нет, и решение строится на бинарном поиске. Это простая алгоритмическая задача, смысл которой в том, чтобы каждый раз делить оставшийся диапазон на 2. Таким образом мы с каждой попыткой вдвое сокращаем область поиска, увеличивая шансы на успех. Вот и весь математический фокус.
Допустим, первой догадкой алгоритма будет число 50, после чего становится понятно, в какую сторону исходного диапазона «шагать» дальше: это будет область 0–50 либо 51–100. Если первый вариант, то далее алгоритм предложит число 25 и так далее. Математические законы предполагают, что если число 100 делить вдвое 7 раз, мы гарантированно получим результат в районе единицы.
Можно найти число и в диапазоне побольше — от 0 до 127 или от 1 до 128. Всё потому, что 27=128. Соответственно, если у нас будет 8 попыток, область можно увеличить до 256, если 9 — до 512 и т. д. По этому же принципу работают бинарные деревья.
Но решать всё вручную с калькулятором наперевес — прошлый век. Давайте подключим код и посмотрим, как с этим справится программа.
Решение кодом
Воспроизведём решение с помощью Java без использования графического интерфейса. При желании всегда можно подключить Swing или JavaFX.
Для начала определимся с переменными, которые нам потребуются:
//заданные границы: int min = 0; int max = 100; //середина области: int midrange = Math.round((min + max) / 2); //строка для работы с терминалом: String strInput = "";
Поскольку мы будем работать с терминалом, подключим слушатель событий с помощью класса Scanner:
import java.util.Scanner;
И объявим переменную слушателя:
Scanner scan = new Scanner(System.in);
Далее всё просто: программа выводит варианты, а пользователь отправляет + , — или = , в зависимости от того, больше загаданное число, меньше или идентично. Пока введённое значение не = ( while (!strInput.equals(«=»)) ), продолжаем вычислять и делить заданный диапазон:
import java.util.Scanner; public class Main < public static void main(String[] args) < int min = 0; int max = 100; int midrange = Math.round((min + max) / 2); String strInput = ""; Scanner scan = new Scanner(System.in); System.out.println("Загадайте число от 0 до 100: я угадаю его за 7 попыток!\n" + "Чтобы продолжить, введите любое значение:"); strInput = scan.nextLine(); while (!strInput.equals("=")) < System.out.println("Это число больше, меньше или равно " + midrange + "? " + "Введите '+' если больше, '-' если меньше и '=' если равно:"); strInput = scan.nextLine(); if (strInput.equals("=")) < System.out.println("Отлично! Ваше число " + midrange + ". Спасибо за игру ;)"); break; >else if (strInput.equals("+")) < //уменьшаем диапазон: min = midrange; //находим новую середину диапазона: midrange = Math.round((min + max) / 2); //если округление сравнило середину с нижней границей, увеличиваем середину на 1: if (min == midrange && midrange!=100) < midrange += 1; >> else if (strInput.equals("-")) < max = midrange; midrange = Math.round((min + max) / 2); >> > >
Понравилась задачка? Держите ещё один математический фокус в виде гипотезы Коллатца.
Не могу решить задачу на Python?
Читаю книгу «Программируем на Python» Майкла Доусона и наткнулся на задачу.
Суть Задачи в том, чтобы пользователь загадывал число, а программа отгадывала, при этом задавая вопрос «Больше или Меньше?».
Вот текст этой задачи:
«А вот задача посложнее. Напишите на псевдокоде алгоритм игры, в которой случайное число от 1 до 100 загадывает человек, а отгадывает компьютер. Прежде чем приступать к решению, задумайтесь над тем, какой должна быть оптимальная стратегия отгадывания. Если алгоритм на псевдокоде будет удачным, попробуйте реализовать игру на Python»
Вот мой код, который я написал :
import random print( "\tДобро пожаловать в игру 'Отгадай число'!") print("\nЗагадывайте число от 1 до 100") print("Я постараюсь отгадать его за минимальное число попыток.") print("Используйте \"Больше\", \"Меньше\", \"Да\" или \"Нет\"\n") max_number = 100 yesOrNot = input("Ваше число 50?\n ") guess = 50 if yesOrNot == "Да" : print("Я нашел это число. ") input("Нажмите Enter чтобы выйти. ") elif yesOrNot == "Нет" : while yesOrNot == "Да" : check = input("Больше или Меньше") if check == "Больше" : guess_r = random.randint(guess, max_number) elif check == "Меньше" : guess_r = random.randit(0, guess) guess_r = max_number guess_r = guess yesOrNot = input("Ваше число ", str(guess_r), "?") print("Я нашел это число") input("Нажмите Enter чтобы выйти. ")
Но программа просто спрашивает «Ваше число 50?», затем просто выводит две последние строки при этом на смотря на условия.
- Вопрос задан более трёх лет назад
- 33767 просмотров
6 комментариев
Оценить 6 комментариев
А чему равно yesOrNot == «Да» при первой проверке?
Кузя @N_kuzya Автор вопроса
Влад: Неважно, что отвечает пользователь программа все равно прописывает две последние строки и все.
while yesOrNot != «ДА»
Но дальше, сам цикл, то же не правильный
Дмитрий Попов @DigitalLev
Тебя эти строчки не смущают?)
elif yesOrNot == "Нет" : while yesOrNot == "Да" :
При таком условии данный цикл выполнятся не будет.
Кузя @N_kuzya Автор вопроса
Юрий Дягилев: Суть была в том, чтобы если он отвечал что загаданное число не 50( то есть он отвечал Нет), программа будет работать до тех пор, пока ответ не будет Да
Здесь только то, что Майкл Доусон объяснял от начала своей книги до главы 3 включительно.
# Комп, отгадай число # Человек загадывает случайное число от 1 до 100. # Комп пытается его угадать, # а человек говорит больше, меньше или в точку # Псевдокод # приветствие и объяснение правил # предложить юзеру загадать число от 1 до 100 # импортируем ГСЧ # задать начальные условия # включить ГСЧ от a до b # номер попытки приравнять к 1 # пока число не совпадет с загаданным # вывести число # спросить у юзера то ли это число # если да то # закончить игру, посчитав количество попыток # если больше # включить ГСЧ от последнего предложенного до b # если меньше # включить ГСЧ от a до последнего предложенного print('\tWelcome to the game "PC guess the number"!' #приветствуем '\n\nMake a number from 1 to 100. I will try to guess it.' #объясняем правила '\n\nPlease, make a number from 1 to 100 and write it down on a piece of paper.') #предлагаем придумать число import random #импортируем ГСЧ #задаем начальные условия a = 1 #начальная граница диапазона b = 100 #конечная граница диапазона user_number = int(input('Press "0" to start: ')) #вводим начальное загаданное число вне диапазона (обход бага) comp_number = random.randint(a, b) #включаем ГСЧ от a до b tries = 1 #количество попыток #цикл отгадывания while comp_number != user_number: print('\nIs it number', str(comp_number) + '?') user_answer = input('If I am right, then enter "Y",' '\nif the hidden number is greater, then enter "M",' '\nif is less, then enter "L"' '\n ') #спрашиваем у юзера if user_answer == 'Y': user_number = comp_number print('\nHidden number is', str(user_number) + '. I made', tries, 'tries. Game over.') break elif user_answer == 'M': a = comp_number + 1 comp_number = random.randint(a, b) elif user_answer == 'L': b = comp_number - 1 comp_number = random.randint(a, b) tries += 1
Решения вопроса 2

Артём Белоусов @flygrounder
Python/Django
У вас изначально странная стратегия отгадывания. Оптимальная будет такой: две переменных left=1 и right=100. И всегда спрашивать Ваше число (left+right)//2? Если больше, то left = (left+right)//2 + 1, если меньше, то right = (left + right)//2 — 1, если оно, то выйти. Гарантированно угадает за log2(n) вопросов, при n=100 за 7 вопросов.
UPD: Вот накидал реализацию
left = 1 right = 100 while True: current = (left+right)//2 is_right = input('Ваше число:<>?(да, больше, меньше)'.format(current)) if is_right.lower() == 'да': print('Я его угадал!') break elif is_right=='больше': left = current + 1 else: right = current - 1
Ответ написан более трёх лет назад
Нравится 4 3 комментария
Нет ощущения отгадывания, просто перебор.
iAzzy: Это не перебор. Это именно алгоритм. Метод половинного деления или метод бисекции, если хотите.

Бинарный поиск)
Рандом даст ощущение отгадывания?
import random number = int(input("Введите число от 1 до 100: ")) x = 1 y = 100 guess = random.randint (x, y) tries = 1 if number == guess: print('С первой попытки!') else: while guess != number: if number > guess: print("Загаданное число больше: ", guess) x = guess guess = random.randint(x, y) tries += 1 elif number < guess: print("Загаданное число меньше: ", guess) y = guess guess = random.randint(x, y) tries += 1 print (number) print ('В яблочко, с', tries, 'попытки')
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 5
Тут есть и проверка на мухлевку и правильное сужение диапазона! Мой код будет отгадывать быстрее.
import random print("загадайте число от 0 до 100") print( "Если мое число меньше или больше вашего вводите '' соответственно, а если я угадал, то введите 'y' и нажмите Enter" ) rnd = 50 min_diapazona = 0 max_diapazona = 100 otvet = "" while 1 > 0: print("Мое число:", rnd, "я угадал? Диапазон от", min_diapazona, "до", max_diapazona) otvet = input() if otvet == "y": print("Я угадал! Игра окончена.") break elif otvet == "": min_diapazona = rnd + 1 try: rnd = random.randint(min_diapazona, max_diapazona) except: print("Вы мухлевщик! Я с вами больше не играю! Игра окончена!") break else: print("Неправельнй ввод! Допустимые символы: '' и 'y'")
Ответ написан более двух лет назад
Комментировать
Нравится 1 Комментировать
# Игра для компьютера "Отгадай число" import random number=input("Введите загаданное вами число в диапазоне [0;100]: ") x=0 y=100 tries=1 computer_number=random.randrange(x,y+1) while x!=y: print("Ваше число равно,больше или меньше:",computer_number) z=input() if 'больше' in z.lower(): x=computer_number computer_number=random.randrange(x,y) tries+=1 elif 'меньше' in z.lower(): y=computer_number computer_number=random.randrange(x,y) tries+=1 elif 'равно' in z.lower(): break print('Ваше число:',number,' ,а число найденное компьютером: ',computer_number,'кол-во попыток:',tries)
Ответ написан более трёх лет назад
У одного из челиков была классная идея насчет оптимизации данной программы тип там с поиском в меньших интервалах, но я пока не допер как бы получше это описать.
# Комп, отгадай число
# Человек загадывает случайное число от 1 до 100.
# Комп пытается его угадать,
# а человек говорит больше, меньше или в точку
# приветствие и объяснение правил
# предложить юзеру загадать число от 1 до 100
# импортируем ГСЧ
# задать начальные условия
# включить ГСЧ от a до b
# номер попытки приравнять к 1
# пока число не совпадет с загаданным
# вывести число
# спросить у юзера то ли это число
# если да то
# закончить игру, посчитав количество попыток
# если больше
# включить ГСЧ от последнего предложенного до b
# если меньше
# включить ГСЧ от a до последнего предложенного
print('\tWelcome to the game "PC guess the number"!' #приветствуем
'\n\nMake a number from 1 to 100. I will try to guess it.' #объясняем правила
'\n\nPlease, make a number from 1 to 100 and write it down on a piece of paper.') #предлагаем придумать число
import random #импортируем ГСЧ
#задаем начальные условия
a = 1 #начальная граница диапазона
b = 100 #конечная граница диапазона
user_number = int(input('Press "0" to start: ')) #вводим начальное загаданное число вне диапазона (обход бага)
comp_number = random.randint(a, b) #включаем ГСЧ от a до b
tries = 1 #количество попыток
#цикл отгадывания
while comp_number != user_number:
print('\nIs it number', str(comp_number) + '?')
user_answer = input('If I am right, then enter "Y",'
'\nif the hidden number is greater, then enter "M",'
'\nif is less, then enter "L"'
'\n ') #спрашиваем у юзера
if user_answer == 'Y':
user_number = comp_number
print('\nHidden number is', str(user_number) + '. I made', tries, 'tries. Game over.')
break
elif user_answer == 'M':
a = comp_number + 1
comp_number = random.randint(a, b)
elif user_answer == 'L':
b = comp_number - 1
comp_number = random.randint(a, b)
tries += 1
Ответ написан более трёх лет назад
Сорри, отступы при копировании не сохранились
Разобрался, как правильно вставить код. В нем только то, что проходили по книге Майкла Доусона от начала до Chapter3 включительно.
# Комп, отгадай число # Человек загадывает случайное число от 1 до 100. # Комп пытается его угадать, # а человек говорит больше, меньше или в точку # Псевдокод # приветствие и объяснение правил # предложить юзеру загадать число от 1 до 100 # импортируем ГСЧ # задать начальные условия # включить ГСЧ от a до b # номер попытки приравнять к 1 # пока число не совпадет с загаданным # вывести число # спросить у юзера то ли это число # если да то # закончить игру, посчитав количество попыток # если больше # включить ГСЧ от последнего предложенного до b # если меньше # включить ГСЧ от a до последнего предложенного print('\tWelcome to the game "PC guess the number"!' #приветствуем '\n\nMake a number from 1 to 100. I will try to guess it.' #объясняем правила '\n\nPlease, make a number from 1 to 100 and write it down on a piece of paper.') #предлагаем придумать число import random #импортируем ГСЧ #задаем начальные условия a = 1 #начальная граница диапазона b = 100 #конечная граница диапазона user_number = int(input('Press "0" to start: ')) #вводим начальное загаданное число вне диапазона (обход бага) comp_number = random.randint(a, b) #включаем ГСЧ от a до b tries = 1 #количество попыток #цикл отгадывания while comp_number != user_number: print('\nIs it number', str(comp_number) + '?') user_answer = input('If I am right, then enter "Y",' '\nif the hidden number is greater, then enter "M",' '\nif is less, then enter "L"' '\n ') #спрашиваем у юзера if user_answer == 'Y': user_number = comp_number print('\nHidden number is', str(user_number) + '. I made', tries, 'tries. Game over.') break elif user_answer == 'M': a = comp_number + 1 comp_number = random.randint(a, b) elif user_answer == 'L': b = comp_number - 1 comp_number = random.randint(a, b) tries += 1
Пишем программу на Python с помощью ChatGPT
Представим ситуацию: мы не умеем программировать на Python, но знаем, что ChatGPT умеет. Наша задача — не написав самим ни одной строчки кода, создать код, который будет делать что-то полезное. Всё, что мы можем делать — это отправлять запросы в чат, брать оттуда код и смотреть на результат. Заодно узнаем, получится ли так программировать или нет.
Что делаем
Мы попросим ChatGPT написать код, который угадает число от 1 до 100 за 7 попыток. В «Коде» мы уже писали про эту задачу и про алгоритм её решения, поэтому будем сверяться с ним.
Для решения используем сервис Chad — внутри ChatGPT 3.5 и 4 на выбор, работает в России без ВПН и понимает русский язык.

Первый подход: код есть, но не работает
Открываем Chad и выбираем режим для разработчиков, который посередине:

Пишем запрос в самой простой форме, указывая только ключевые моменты:
Напиши программу на Python, которая угадывает число, которое загадал пользователь от 1 до 100 за 7 попыток или меньше.
В ответ сервис даёт код и поясняет, что он делает: как будет работать и для чего нужна определённая переменная:

import random def guess_number(start, end, max_attempts): print(f"Загадайте число от до . Я попытаюсь его угадать за попыток или меньше.") low = start high = end for attempt in range(1, max_attempts + 1): guess = random.randint(low, high) print(f"Попытка #: Я думаю, это число .") if guess == user_number: print("Ура! Я угадал число!") return elif guess < user_number: print("Мое число слишком маленькое.") low = guess + 1 else: print("Мое число слишком большое.") high = guess - 1 print("К сожалению, я не смог угадать число за заданное количество попыток.") user_number = random.randint(1, 100) # Пользователь загадывает число от 1 до 100 guess_number(1, 100, 7)
Но при запуске этого кода мы получаем странный результат — программа моментально проходит 7 попыток и сообщает, что ничего не угадала:

Второй подход: исправляем ошибку
Раз компьютер не отгадал число за 7 попыток, значит, с алгоритмом явно что-то не так. Просим объяснить, что происходит в программе:
Прокомментируй в этом коде каждую строку
Это код на языке Python, который представляет собой простую игру "угадай число". Давай разберем его построчно:
1. `import random` - импорт модуля random, который позволяет нам генерировать случайные числа.
2. `def guess_number(start, end, max_attempts):` - определение функции с именем `guess_number`, которая принимает три аргумента: `start` (начальное значение диапазона чисел), `end` (конечное значение диапазона чисел) и `max_attempts` (максимальное количество попыток).
3. `print(f"Загадайте число от до . Я попытаюсь его угадать за попыток или меньше.")` - выводит сообщение с использованием значений `start`, `end` и `max_attempts` для подсказки пользователю о правилах игры.
4. `low = start` - присваивает переменной `low` значение `start`. Переменная `low` будет использоваться для хранения текущего нижнего значения диапазона.
5. `high = end` - присваивает переменной `high` значение `end`. Переменная `high` будет использоваться для хранения текущего верхнего значения диапазона.
6. `for attempt in range(1, max_attempts + 1):` - начинает цикл, который будет выполняться `max_attempts` раз. Переменная `attempt` будет принимать значения от 1 до `max_attempts`.
7. `guess = random.randint(low, high)` - генерирует случайное число в диапазоне от `low` до `high` и присваивает его переменной `guess`. Это предполагаемое число, которое попытается угадать компьютер
8. `print(f"Попытка #: Я думаю, это число .")` - выводит сообщение с использованием текущего значения `attempt` и `guess` для показа предполагаемого числа компьютера.
9. `if guess == user_number:` - проверяет, равно ли предполагаемое число `guess` загаданному пользователем числу `user_number`.
10. `print("Ура! Я угадал число!")` - выводит сообщение, если компьютер угадал число пользователя.
11. `return` - прерывает выполнение функции и возвращает управление обратно в основную программу.
13. `print("Мое число слишком маленькое.")` - выводит сообщение, если предполагаемое число `guess` слишком маленькое.
14. `low = guess + 1` - присваивает переменной `low` значение `guess + 1`, чтобы ограничить будущие предполагаемые числа в большем диапазоне.
15. `else:` - выполняется, если ни одно из предыдущих условий не выполнилось, что означает, что `guess` больше, чем `user_number`.
16. `print("Мое число слишком большое.")` - выводит сообщение, если предполагаемое число `guess` слишком большое.
17. `high = guess - 1` - присваивает переменной `high` значение `guess - 1`, чтобы ограничить будущие предполагаемые числа в меньшем диапазоне.
18. `print("К сожалению, я не смог угадать число за заданное количество попыток.")` - выводит сообщение, если компьютер не смог угадать число в заданное количество попыток.
19. `user_number = random.randint(1, 100)` - генерирует случайное число от 1 до 100 и присваивает его переменной `user_number`. Это число, которое пользователь должен загадать.
20. `guess_number(1, 100, 7)` - вызывает функцию `guess_number` с аргументами `1`, `100` и `7`. Это начинает игру, где пользователь должен загадать число от 1 до 100, а компьютер будет пытаться угадать за 7 попыток или меньше.
Ага, значит, значение переменной guess, которая отвечает за очередную попытку угадать число, выбирается случайным образом (точно так же, как это делает user_number ). Но в теоретическом решении написано, что нужно взять диапазон и поделить его пополам. Значит, нам нужно попросить исправить код, чтобы диапазон делился пополам:
У тебя в коде ошибка — он угадывает число случайным образом вместо того, чтобы находить границы диапазона и делить его пополам, предлагая это как новую попытку. Исправь это и дай новый код.
Вот что получили в ответ:
Понимаю, извините за путаницу. Вот исправленный код, который выполняет угадывание числа путем деления диапазона пополам.
В этом обновленном коде используется метод деления диапазона пополам для каждой попытки. Вместо случайного числа, программе необходимо определить середину текущего диапазона (guess = (low + high) // 2).
После предложения числа пользователь проверяет ответ и сообщает программе, является ли загаданное число больше или меньше предложенного числа. Затем диапазон обновляется путем изменения нижней или верхней границы в зависимости от ответа пользователя.
def guess_number(start, end, max_attempts): print(f"Загадайте число от до . Я попытаюсь его угадать за попыток или меньше.") low = start high = end for attempt in range(1, max_attempts + 1): guess = (low + high) // 2 print(f"Попытка #: Я думаю, это число .") if guess == user_number: print("Ура! Я угадал число!") return elif guess < user_number: print("Мое число слишком маленькое.") low = guess + 1 else: print("Мое число слишком большое.") high = guess - 1 print("К сожалению, я не смог угадать число за заданное количество попыток.") user_number = random.randint(1, 100) # Пользователь загадывает число от 1 до 100 guess_number(1, 100, 7)
Копируем, вставляем в редактор кода, запускаем — и получаем ошибку NameError: name 'random' is not defined . Спрашиваем, что с ней делать:
Что означает ошибка NameError: name 'random' is not defined и как её исправить
Вот что предлагает ChatGPT:
Ошибка NameError: name 'random' is not defined возникает, когда пытаемся использовать имя, которое не было определено или импортировано в текущей области видимости.
В приведенном коде, ошибка может возникнуть, если модуль random не был импортирован в вашей программе.
Чтобы исправить эту проблему, в начале программы добавьте строку import random. Это позволит использовать функции и классы из модуля random.
Оказывается, сервис забыл добавить команду import random, чтобы можно было пользоваться генератором случайных чисел. Берём её из первой версии кода и запускаем:

Теперь код угадывает любое число до 100 за 7 попыток или меньше, но есть проблема — здесь нет взаимодействия с пользователем, в эту игру неинтересно играть, когда компьютер сам загадывает и сам угадывает числа.
Третий подход: добавляем интерактив
Чтобы пользователь тоже поучаствовал в игре, просим ChatGPT добавить интерактив:
Сейчас у тебя в коде загаданное число задаётся случайным образом. Сделай так, чтобы пользователь сам вводил число, которое он загадал.
Вот что получаем в ответ:
В этой версии кода после предложения ввести число пользователь будет приглашен ввести загаданное число, с которым программа будет пытаться угадать. Загаданное число сохраняется в переменную user_number в виде целого числа с помощью функции int(input()).
После этого программа продолжает работу и пытается угадать число, используя метод деления диапазона пополам, как было описано выше.
def guess_number(start, end, max_attempts): print(f"Загадайте число от до . Я попытаюсь его угадать за попыток или меньше.") low = start high = end user_number = int(input("Введите загаданное число: ")) for attempt in range(1, max_attempts + 1): guess = (low + high) // 2 print(f"Попытка #: Я думаю, это число .") if guess == user_number: print("Ура! Я угадал число!") return elif guess < user_number: print("Мое число слишком маленькое.") low = guess + 1 else: print("Мое число слишком большое.") high = guess - 1 print("К сожалению, я не смог угадать число за заданное количество попыток.") guess_number(1, 100, 7)

Уже интереснее, но всё равно игра проходит слишком быстро. Надо поменять компьютер и игрока местами, чтобы игрок сам отвечал на вопросы, давая подсказки компьютеру.
Четвёртый подход: добавляем ответы игрока
Улучшаем код и пишем такой запрос:
Теперь поменяй код так, чтобы программа предлагала свои варианты, а пользователь отвечал, его число больше, меньше или равно предложенному.
Сервис сразу меняет код и даёт большое пояснение, как что внутри работает:
В этой версии кода программа использует бесконечный цикл while True, чтобы предлагать свои варианты и ждать от пользователя ответа о том, больше, меньше или равно его число предложенному.
На каждой итерации цикла программа предлагает свой вариант с помощью переменной guess, затем ожидает ввода пользователя с помощью input(). Ввод пользователя сохраняется в переменную user_input.
Затем, в зависимости от ответа пользователя, программе сообщается об изменении диапазона для следующей попытки. Если число пользователя больше предложенного, мы обновляем нижнюю границу, увеличивая ее на 1 (low = guess + 1). Если число пользователя меньше предложенного, обновляем верхнюю границу, уменьшая ее на 1 (high = guess - 1). Если число пользователя равно предложенному, программа завершается.
def guess_number(start, end): print(f"Загадайте число от до . Я попытаюсь его угадать.") low = start high = end while True: guess = (low + high) // 2 print(f"Я думаю, это число .") user_input = input("Ваше число больше (>), меньше (<) или равно (=) предложенному? ") if user_input == '>': low = guess + 1 elif user_input == '

Пятый подход: счётчик попыток
Всё работает, но мы теперь не видим номера попыток, а без этого нам непонятно, получилось угадать число за 7 подходов или нет. Просим компьютер добавить это:
Теперь добавь сюда счётчик попыток, чтобы в конце добавить, за сколько попыток было угадано это число
Получаем новый код и комментарий:
В этой версии кода мы добавляем переменную attempts, которая будет отслеживать количество попыток, сделанных программой для угадывания числа.
На каждой итерации цикла while, когда программа делает новую попытку, мы увеличиваем attempts на 1 (attempts += 1).
При угадывании числа, вместе с сообщением об успехе, теперь выводится и количество попыток, затраченных на угадывание: print(f"Ура! Я угадал число за попыток!").
def guess_number(start, end): print(f"Загадайте число от до . Я попытаюсь его угадать.") low = start high = end attempts = 0 while True: guess = (low + high) // 2 attempts += 1 print(f"Попытка #: Я думаю, это число .") user_input = input("Ваше число больше (>), меньше (<) или равно (=) предложенному? ") if user_input == '>': low = guess + 1 elif user_input == ' <': high = guess - 1 elif user_input == '=': print(f"Ура! Я угадал число за попыток!") return else: print("Некорректный ввод. Попробуйте снова.") print("К сожалению, я не смог угадать число.") guess_number(1, 100)

Шестой подход: делаем красивое оформление
Технически мы решили задачу, но хочется сделать результат визуально лучше. Для этого попросим так:
Теперь сделай так, чтобы каждая попытка угадывания числа выводилась зелёным шрифтом
На этот раз сервис нам скажет, что для этого нужна отдельная библиотека, и даже скажет, как её установить:
Хорошо. Чтобы каждая попытка угадывания числа выделялась зеленым цветом, мы можем использовать модуль termcolor из сторонней библиотеки.
Перед использованием модуля termcolor удостоверьтесь, что у вас установлена эта библиотека. Если она не установлена, можете установить ее с помощью команды pip install termcolor в командной строке.
В этой версии кода мы импортируем функцию colored из модуля termcolor. Эта функция позволяет нам изменять цвет текста в консоли.
Теперь мы применяем функцию colored() к сообщению с попыткой угадывания числа, чтобы выделить его зеленым цветом: print(colored(f"Попытка #: Я думаю, это число .", 'green')).
Кроме того, при успешном угадывании числа мы используем функцию colored() для выделения сообщения с количеством попыток синим цветом: print(colored(f"Ура! Я угадал число за попыток!", 'blue')).
Устанавливаем библиотеку и запускаем код:
from termcolor import colored def guess_number(start, end): print(f"Загадайте число от до . Я попытаюсь его угадать.") low = start high = end attempts = 0 while True: guess = (low + high) // 2 attempts += 1 print(colored(f"Попытка #: Я думаю, это число .", 'green')) user_input = input("Ваше число больше (>), меньше (<) или равно (=) предложенному? ") if user_input == '>': low = guess + 1 elif user_input == ' <': high = guess - 1 elif user_input == '=': print(colored(f"Ура! Я угадал число за попыток!", 'blue')) return else: print("Некорректный ввод. Попробуйте снова.") print("К сожалению, я не смог угадать число.") guess_number(1, 100)

Что в итоге
Вот что мы выяснили:
- Написать код с ChatGPT на Python без сильных знаний в программировании — вполне реально.
- ChatGPT понимает контекст, может исправлять свой код и объяснять, что он делает.
- С русскоязычными запросами всё работает нормально, сервис понимает, что мы от него хотим.
- Так можно написать простые программы, а сложные — неизвестно, надо проверять. Этим и займёмся в следующий раз.
