Алгоритм для программы Python
Я недавно начал изучать Python. Эту задачу я решил, но она работает криво и не так, как должно быть. У меня возникла проблема, что я понимаю, как написать программу, но не могу правильно выразить мысли в коде.
left = 0 right = 1000 answer = None while answer != '=': answer = input() if answer == '=': print('Я угадал!') break elif answer == '': right = (right - left) // 2 + left print(right, '?')
Отслеживать
задан 29 окт 2018 в 20:14
97 3 3 серебряных знака 16 16 бронзовых знаков
начинать явно стоит с вывода предложения 500. А иначе на что будет давать ответ пользователь ?
29 окт 2018 в 20:46
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В целом ваше решение не такое уж и плохое, предлагаю несколько шагов по улучшению:
Во первых, в вашем решении сбивает то что пользователю ничего не показывается при запуске программы, это решается вычислением первого числа до цикла while .
left = 0 right = 1001 current = (left + right) // 2
Обратите внимание что right мы устанавливаем в 1001 а не 1000, это необходимо что бы при «угадывании» захватить число 1000 .
Во вторых, я бы рекомендовал вынести вывод текущего числа в начало цикла, так же для того что бы показать пользователю текущее значение и ожидать его реакции.
while answer != '=': print(current, '?') answer = input()
В третьих, после этого можно внести небольшие изменения в цепочку if-elif , этот вариант отличается от вашего тем что здесь изменяются только границы нашего вычисления и добавлена обработка некорректного ввода
if answer == '=': print('Я угадал!') break elif answer == '>': left = current elif answer == ',
И самом конце цикла добавляем сточку с вычислением текущего значения
current = (left + right) // 2
Код полностью
left = 0 right = 1001 current = (left + right) // 2 answer = None while answer != '=': print(current, '?') answer = input() if answer == '=': print('Я угадал!') break elif answer == '>': left = current elif answer == ',
Решаем кодом: программа угадает число за 7 попыток
Недавно у нас была задачка про то, как угадать любое число от 1 до 100 за 7 попыток. Кратко логика такая:
- Оппонент загадывает целое число от 1 до 100.
- Мы называем своё целое число в этом диапазоне.
- Оппонент говорит, наше число больше или меньше, чем то, которое он загадал.
- Удивительно то, что за 7 попыток можно гарантированно угадать любое число от 1 до 100.
Секрет решения в том, что с каждой попыткой мы делим диапазон поиска числа вдвое. Например, наша первая догадка будет 50, и после неё мы узнаем, в каком отрезке искомое число: от 1 до 50 или от 51 до 100. Например, оно больше 50. Мы берём диапазон чисел от 51 до 100 и делим его пополам — получается 75. Это следующее предположение. И так мы «складываем вдвое» область поиска, пока не останется одно число. А математические законы таковы, что если 100 поделить на 2 семь раз подряд, получится плюс-минус единица.
Теперь сделаем следующий шаг — автоматизируем эту игру в виде простого веб-приложения. Пусть потеет машина.
Логика угадывателя
Наш угадывательный скрипт будет работать ровно так же, как в исходной игре: на каждом шаге делим диапазон угадывания пополам, округляем до целого и называем это значение. Если больше или меньше — делаем то же самое с новым диапазоном, а если угадали — выводим сообщение.
Сделаем проект в виде HTML-страницы: так нам будет удобнее выводить сообщения, а пользователю — нажимать на кнопки.
Готовим страницу
За основу возьмём страницу со стилями из проекта про калькулятор и выкинем из неё всё лишнее. Заодно сразу наполним её двумя элементами:
- Приветственной надписью, которая скажет, что нужно сделать.
- Кнопкой, по нажатию на которую запустится игровой скрипт.
Как угадать число от 0 до 100 /*задаём общие параметры для всей страницы: шрифт и отступы*/ body < text-align: center; margin: 10; font-family: Verdana, Arial, sans-serif; font-size: 16px; >/* внешний вид кнопок */ button // обрабатываем нажатие на стартовую кнопку function start()

Мы сразу добавили сюда скрипт с пустой функцией, чтобы страница не выдавала ошибку при нажатии. Теперь надо сделать так, чтобы эти два элемента, текст и кнопка, исчезли по нажатию, а вместо них появился интерфейс игры.
Скрываем элементы
Чтобы скрыть то, что сейчас на экране, мы сделаем так:
- В том же проекте с калькулятором возьмём код, который добавляет и убирает классы у разных элементов на странице.
- Добавим класс скрытия текущим элементам.
Первый пункт делается просто — добавим в стили такой блок:
А чтобы скрыть элементы, в стартовой функции напишем две команды:
// скрываем приветственную надпись и кнопку
document.getElementById("startText").classList.add("notOnScreen");
document.getElementById("startButton").classList.add("notOnScreen");
Всё, теперь при нажатии на кнопку у нас снова будет пустая страница.
Добавляем элементы с интерфейсом игры
Теперь решим обратную задачу: добавим на экран текстовый блок, где мы будем угадывать число, и три кнопки, которые будет нажимать игрок: больше, меньше или равно.
Используем тот же механизм, только не для удаления, а для добавления элементов: сначала они у нас будут скрытыми за счёт того класса, а потом мы этот класс у них уберём. Получится, что одно как бы исчезло, а другое — появилось, хотя на самом деле всё осталось на месте, а поменялось только свойство отображения.
Игровой интерфейс будет простой: текст с угадыванием и кнопки. В тексте мы сразу выводим номер попытки и середину нашего диапазона. Если попытки закончились — называем число. Чтобы за всем этим следить, сразу заведём нужные переменные:
// границы, в которых мы угадываем число var min = 0; var max = 100; // середина диапазона var middle = Math.floor((min + max)/2); // количество попыток var stage = 1;
Кнопки изначально будут скрыты с помощью класса notOnScreen, а при нажатии на каждую будет срабатывать своя функция. До них мы дойдём чуть позже, пока просто пропишем механику на странице под прошлыми элементами:
Теперь, чтобы магия сработала, добавим этот код в функцию start():
// показываем текст с первой попыткой document.getElementById("question").classList.remove("notOnScreen"); document.getElementById("question").innerHTML = "Попытка " + stage + ": " + middle; // и три игровые кнопки document.getElementById("small").classList.remove("notOnScreen"); document.getElementById("bingo").classList.remove("notOnScreen"); document.getElementById("big").classList.remove("notOnScreen");

Обрабатываем нажатия на кнопки
Задача кнопок «Больше» и «Меньше» — сократить пополам диапазон возможных значений. Для этого они делят его пополам и округляют до целого числа. Проблема в том, что иногда компьютер может округлить число обратно до минимальной или максимальной границы и предложить это же число заново.
Чтобы такого не было, добавим в функции простую проверку: если новая граница совпадает с минимальным или максимальным значением диапазона, то принудительно двигаем её на единицу в нужную сторону.
Финальный штрих: добавим в каждую функцию в конце проверку на выигрыш. Так как проверка везде одинаковая, то сделаем её отдельной функцией.
// если загадано число, которое меньше, чем на экране function smallClick() < // уменьшаем диапазон max = middle; // находим новую середину диапазона middle = Math.floor((min + max)/2); // если при округлении середина совпала с текущей верхней границей — уменьшаем её на единицу if (max == middle) < middle -= 1; >// проверяем результат checkGame(); > // если загадано число, которое больше, чем на экране function bigClick() < // уменьшаем диапазон min = middle; // находим новую середину диапазона middle = Math.floor((min + max)/2); // если при округлении середина совпала с текущей нижней границей — увеличиваем её на единицу if (min == middle) < middle += 1; >// проверяем результат checkGame(); > // если мы угадали function bingoClick() < // уменьшаем диапазон до одного числа max = middle; min = middle; // проверяем результат checkGame(); >

Добавляем проверку на выигрыш
Если наш диапазон сузился до одного числа — значит, мы его нашли и можно выводить сообщение о победе. Также сразу предусмотрим сценарий, когда игрок жульничает и специально нажимает не те кнопки:
// проверяем, угадали или нет function checkGame() < // если в диапазоне осталось только одно число — называем его if (min == max)< document.getElementById("question").innerHTML = "Вы загадали число " + min; // убираем кнопки document.getElementById("small").classList.add("notOnScreen"); document.getElementById("bingo").classList.add("notOnScreen"); document.getElementById("big").classList.add("notOnScreen"); // игра закончена return; >// увеличиваем счётчик попыток stage += 1; if (stage == 8) < // выводим сообщение об ошибке document.getElementById("question").innerHTML = "Жульничать — нехорошо!"; >// выводим новое предположение на экран document.getElementById("question").innerHTML = "Попытка " + stage + ": " + middle; >
Готовый код
Как угадать число от 0 до 100 /*задаём общие параметры для всей страницы: шрифт и отступы*/ body < text-align: center; margin: 10; font-family: Verdana, Arial, sans-serif; font-size: 16px; >/* внешний вид кнопок */ button < font-family: Verdana, Arial, sans-serif; font-size: 16px; margin: 10px; padding: 10px; >.notOnScreen
Бинарная угадайка python
Напишите программу, которая отгадывает загаданное целое число от 1 до 1000 (пользователь загадывает число в уме и не сообщает программе). Угадать число нужно не более чем за 10 попыток. На каждую попытку пользователь отвечает, что названное число больше загаданного (вводит символ “>”), меньше загаданного (“<”) или угадано правильно (“=”).
Используйте бинарный поиск. Программа должна каждый раз называть число, находящееся посередине исследуемого диапазона — в результате станет ясно, в какой половине диапазона находится искомое число.
Например, для диапазона от 1 до 8 (а не до 1000) это могло бы выглядеть так (загадано число 5):
Лучший ответ
РусланЗнаток (435) 5 лет назад
Со временем программа тупеет и начинает на один и тот-же знак прибавлять и убавлять одну единичку
Например:
">" или "" или "" или "" или "" или "" или "
Программа "Угадай число"
Отгадать целое число, которое "загадал" компьютер в определенном диапазоне.
- a – число, "загаданное" компьютером;
- b – очередное число, вводимое пользователем.
Алгоритм решения задачи:
Программа генерирует псевдослучайное число, которое записывается в переменную a .
Пока число a не совпадет с числом b , пользователю будет предлагаться ввести очередное число. При этом, если b > a , то на экран будет выдаваться сообщение "Много". Иначе будет проверяться условие b < a . При его положительном значении появится сообщение "Мало", иначе сообщение "Угадал".
Не трудно понять, что если b не больше и не меньше a , то значит оно равно a . В таком случае логическое выражение при while вернет false, и цикл прервется.
Программа на языке Паскаль:
var a,b: integer; begin randomize; a := random(100); while a <> b do begin write('Введи число: '); readln(b); if b > a then writeln('Много') else if b < a then writeln('Мало') else writeln('Угадал'); end; end.
Примечание. Угадать число всегда можно не более чем через 6-7 попыток, если делить каждый оставшийся диапазон пополам.