Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 11, 2012 15:20:43

Hando84
Зарегистрирован: 2012-12-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с циклом

Добрый день, уважаемое сообщество.

Задача следующая: Человек загадывает число от 1 до 100, а компьютер его отгадывает, запрашивая после каждой попытки подсказку, больше загадываемое число, меньше или равно предлагаемому им значению. Я новичок в программировании вообще и на Питоне в частности. Это мой первый язык программирования, учусь по учебнику самостоятельно.

Так вот, предлагалось написать алгоритм решения этой задачи на псевдокоде, придумав максимально простой способ. Я подумал что оптимальным было бы создание цикла с делением на 2, то есть пополам верхнего предела, то есть числа 100. Но вот как это реализовать в реальном коде не очень то понимаю. Пробовал написать, не выходит. В принципе этого и не требуется, но хотелось бы все таки написать. Что делаю не так понять довольно трудно, с моими нынешними навыками это может быть просто даже пунктуационные ошибки

Был бы благодарен, если бы вы показали мне цикл такого плана, который корректировался бы посредством подсказок от пользователя со следующими значениями: “загаданное число больше”, “меньше” и "равно выводимому. Заранее спасибо за внимание к моему посту.

Отредактировано Hando84 (Дек. 11, 2012 15:25:19)

Офлайн

#2 Дек. 11, 2012 18:11:22

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Нужна помощь с циклом

Офлайн

#3 Дек. 11, 2012 18:28:18

Hando84
Зарегистрирован: 2012-12-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с циклом

Спасибо, но к сожалению это не совсем то, мне нужно чтобы компьютер угадывал, а не пользователь! Так же спасибо тому, кто выложил код, но почему то потом его удалил. Там было как раз то, что нужно, практически, к сожалению правда отгадывая комп уходил за пределы 100 вверх а вниз опускался до дробных значений типо 0.019 .К сожалению не запомнил ник писавшего. Но все равно мне это помогло продвинуться.. Буду допиливать дальше

Отредактировано Hando84 (Дек. 11, 2012 18:46:09)

Офлайн

#4 Дек. 11, 2012 19:04:31

dugar
От:
Зарегистрирован: 2010-05-23
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с циклом

Из примера выше используйте input для ввода сначения.
Простейший “способ делением на 2”, как вы выразились, называется метод бисекции (смотри Википедию). Ниже далеко не оптимальный код для поиска на коротком отрезке.

total = 100
input_value = 36
output_value = 0

while output_value != input_value:
total = float(total/2)
if output_value > input_value:
output_value -= total
elif output_value < input_value:
output_value += total

print int(output_value)

Как разберешься, спрашивай дальше.



Офлайн

#5 Дек. 11, 2012 19:50:30

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Нужна помощь с циклом

Hando84
правда отгадывая комп уходил за пределы 100 вверх а вниз опускался до дробных значений типо 0.019
поэтому и удалил
вот получше, но тоже неидеально из-за округления целочисленного деления
value = 50
lim_h = 100
lim_l = 0
while True:
    print('{}?'.format(value))
    inp = int(input('1: <\n2: >\nany: =  !!!\n'))
    if inp == 1:
        lim_h = value
        value = (lim_l + value) // 2
    elif inp == 2:
        lim_l = value
        value = (lim_h + value) // 2
    else:
        break

Офлайн

#6 Дек. 11, 2012 20:00:03

dugar
От:
Зарегистрирован: 2010-05-23
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с циклом

sergeek
Для точного вычисления в таких случаях всех проще использовать round(x) с точность, напрмер, 0.001



Офлайн

#7 Дек. 11, 2012 20:16:55

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Нужна помощь с циклом

max_num = 100
min_num = 0
x = 71 # загадал юзер.
while 1:
    v = (max_num + min_num) // 2 # попытка угадать.
    if v > x:
        max_num = v - 1
    elif v < x:
        min_num = v + 1
    elif v == x:
        break

Офлайн

#8 Дек. 11, 2012 20:26:50

dugar
От:
Зарегистрирован: 2010-05-23
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с циклом

dimy44
Этот способ не намного быстрее обычного перебора.
Представьте если потребуется угадать float 71.46, шаг итерации 0.01.
Сколько потребуется времени?
Хотя для поставленной задачи на отрезке 100, шаг 1 не столь критичен.



Офлайн

#9 Дек. 11, 2012 20:33:10

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Нужна помощь с циклом

Чето подумал, что задача для целых…

Офлайн

#10 Дек. 11, 2012 21:06:34

dugar
От:
Зарегистрирован: 2010-05-23
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с циклом

dimy44
Чето подумал, что задача для целых…
Она и есть для целых. Просто то, что ты предложил проще написать через for от 0 до 100, с тем же успехом. Т.е. чем x ближе к 0 тем большее число шагов поиска решения. Проблема именно в этом.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version