Преобразование игры псевдокода в питон

голоса
1

Сделайте компьютер угадать номер, который пользователь выбирает между 1 и 1000 не более чем в 10 guesses.This назначение использует алгоритм, называемый бинарный поиск. После каждого предположения, алгоритм сокращения числа возможных ответов для поиска пополам. Псевдокод для полной программы приводятся ниже; Ваша задача состоит в том, чтобы включить его в программу рабочего питона. Программа должна начать печатать инструкции на экране, объясняя, что пользователь должен выбрать число от 1 до 1000 и компьютер будет угадать его не более чем 10 попыток. Затем он начинает делать предположение, и после каждой догадаться, он запрашивает у пользователя обратной связи. Пользователь должен быть проинструктирован, чтобы ввести -1, если догадка должна быть ниже, 0, если он был прав, и 1, если она должна быть higher.When программа угадывает правильно, он должен сообщить, как требовалось много догадок. Если пользователь вводит неверный ответ, инструкции должны быть повторены, и пользователю попытаться снова.

ПСЕВДОКОД

- Print instructions to the user  
-Start with high = 1000, low = 1, and tries = 1 
- While high is greater than low   
  - Guess the average of high and low  
  - Ask the user to respond to the guess  
  - Handle the four possible outcomes:  
    - If the guess was right, print a message that tries guesses were required and quit the program
    - If the guess was too high, set high to one less than the guess that was displayed to the user and increment tries  
    - If the guess was too low, set low to one more than the guess that was displayed to the user and increment tries
    - If the user entered an incorrect value, print out the instructions again
- high and low must be equal, so print out the answer and the value of tries

Мне нужна серьезная помощь! Я не понимаю этого материала на всех! Это все, что я

def main(x, nums, low, high):
        input(Enter -1 if the guess needs to be lower, 0 if the guess was right, or 1 if the guess needs to be higher: )
    for i in range (1, 1001):

main()

и я даже не знаю, правильно ли это!

Задан 14/06/2009 в 04:28
источник пользователем
На других языках...                            


7 ответов

голоса
4

Вы, очевидно, очень новичок в программировании, и я думаю, что это одна из причин задержки с ответом со стороны сообщества. Это трудно решить, с чего начать и как вести вас через все это упражнение.

Поэтому, прежде чем вы получите хороший ответ здесь, что включает в себя заставить вас понять, что там происходит, и направляя вас через создание решения самостоятельно (в идеале!) Я хотел бы предложить вам посетить эту страницу, чтобы попытаться получить представление о самой актуальной проблеме.

http://www.openbookproject.net/pybiblio/gasp/course/4-highlow.html

В то же время, посмотрите на все ответы в этой теме и держать редактирования поста, так что мы знаем, что вы получаете его.

Ответил 14/06/2009 в 04:37
источник пользователем

голоса
1

Хорошо, хорошая часть об использовании Python, что это почти псевдокод в любом случае.

Теперь давайте подумаем об отдельных шагах:

  1. Как получить среднее между высоким и низким?

  2. Как вы спросите пользователя, если answerr правильно

  3. Что делать «если» заявления выглядят как в Python, и как бы вы написать псевдокод, как если заявление?

Вот еще один намек - вы можете запустить питон в качестве переводчика и попробовать индивидуальные заявления вдоль, так, к примеру, вы могли бы сделать

high=23
low=7

то вычислить, что вы думаете, должно быть среднее или середины между ними (подсказка: 15)

Ответил 14/06/2009 в 04:42
источник пользователем

голоса
11

Я не понимаю этого материала на всех!

Это довольно проблематично, но, хорошо, давайте сделаем один шаг за один раз! Ваше домашнее задание начинается:

Печать инструкция для пользователя

Таким образом, вы не понимаете, любой материал, вы говорите, так это означает, что вы не понимаете эту часть тоже. Ну: «пользователь» является человек, который работает ваша программа. «Инструкция» английские фразы, которые говорят ему или ей, что нужно сделать, чтобы играть в игру, в соответствии со следующей цитатой из этого превосходно ясного и подробного назначения:

Программа должна начать печатать инструкции на экране, объясняя, что пользователь должен выбрать число от 1 до 1000 и компьютер будет угадать его не более чем 10 попыток.

« print» Является командой Python , который излучает информацию; Попробуйте , например, программу , содержащую только

print "some information"

чтобы увидеть, как это работает. Хорошо, пожалуйста, вы можете изменить свой ответ, чтобы показать нам, что вы получили эту точку, так что мы можем перейти к следующему? Не стесняйтесь комментировать здесь с дальнейшими вопросами если какие-либо слова или понятия, которые я использую все еще слишком сложная для вас, и я постараюсь разъяснить!

Ответил 14/06/2009 в 04:43
источник пользователем

голоса
14

Прежде чем думать о том, как реализовать это в Python (или любом другом языке) позволяет взглянуть на псевдокоде, который выглядит как довольно хороший план, чтобы решить эту проблему.

Я бы предположил , что одна вещь , которую вы могли бы застрять на путь псевдокод ссылается на переменные , как highи low. Способ понять переменные, чтобы считать их слоты, значения могут быть сохранены. В любой момент времени переменные имеют некоторое значение, как числа 5, или ссылку на открытый файл. Это значение может быть вызвано в любое время, используя его имя, или оно может быть дано новое значение, назначая его, и старое значение будет забыто с новым значением , принимая свое место.

Псевдокод ссылается на три переменные high, lowи tries. Он также сообщает вам , что их начальные значения должны быть. После того , как вторая линия выполнена, эти значения установлены в 1000, 1 и 1, соответственно, но они принимают новые значения по мере продвижения программы.

Еще одна особенность псевдокод является условной цикл, и случай , анализ пользовательского ввода. Ваш перевод петли псевдокода является неправильным. В вашем случае, вы создали новую переменный, iи проинструктировали программу для запуска тела цикла с каждым значением I от 1 до 1000. Очевидно , что это не имеет целые много общего с псевдокодом.

Вместо того, что вы хотите сделать , это бесконечный цикл, пока некоторое условие (которое изменяется в теле цикла) не станет ложным. В питоне, то whileоператор делает это. Если вы знакомы с ifутверждением, whileвыглядит так же, но после того , как тело будет сделано, то условие переоценено и тело выполняются снова , если он по - прежнему верно.

Наконец, анализ случае в теле цикла требует сравнения то ожидаемые значения. Хотя некоторые другие языки имеют ряд способов выражения этого, в питоне мы только if- elif- elseпункты.


Вне преобразования псевдокода в рабочий код, это, вероятно, полезно понять, что программа на самом деле делает. Ключевым моментом здесь является в строке 4, где программа угадает среднее из двух значений. после того, что программа действует как хорошо догадка сработала.

При первом прохождении через петлю, с , highсодержащие 1000 и lowсодержащие 1, в среднем составляет 500 ( на самом деле в среднем составляет 500,5, но так как мы в среднем целых чисел, Python предполагает , что мы хотим , чтобы результат деления также быть целым числом ). Очевидно , что догадка имеет только 0,1% шанс быть правильным, но если это не так, то пользователь должен сообщить нам , если она была слишком высокой или слишком низкой. В любом случае, этот ответ полностью устраняет 50% возможных догадок.

Если, например, пользователь думает о низком числе, тогда, когда программа догадалась 500, пользователь должен сообщить программе, что 500 было слишком высокими, и тогда программа не будет когда-либо предположить, что число было в диапазон 501 через 1000. Это может спасти компьютеру много работы.

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

Когда программа угадывает снова, догадка прямо в середине возможного диапазона, снова резка диапазон пополам. Число возможных догадок пошло от оригинальных 1000 до 500 в одном догадке, 250 в двух догадках. Если программа имеет ужасную судьбу, и не может получить его два (которые на самом деле очень вероятно), то по третьей, она имеет только 125 номера осталось беспокоиться. После четвертого догадка, только 62 числа остаются в диапазоне. Это продолжается, и после восьми догадок, только 3 номера остался, а программа пытается средним числом для его девятой догадки. Если это оказывается не так, только один номер слева, и программа угадывает его!

Этот метод разделения диапазона пополам , а затем продолжает более близкую половину называется бисекция и появляется в широком диапазоне тем , представляющий интереса для компьютерной науки.


Как насчет CODE! Так как я не хочу, чтобы лишить вас опыт обучения, я просто дам вам некоторые фрагменты, которые могут помочь вам вместе. питон является языком, разработанным для интерактивного исследования, поэтому запустите интерпретатор и дать этому выстрел. Я буду отправлять примеры с подсказками показанных, не на самом деле типа этого.

Вот пример , используя whileпункт:

>>> x = 1000
>>> while x > 1:
...     x = x/2
...     print x
...
500
250
125
62
31
15
7
3
1
>>> x
1

Получение консоли ввода от пользователя должно быть сделано с помощью raw_input()функции. Она просто возвращает независимо от типа пользователя. Это немного сложнее , чтобы показать. Чтобы упростить вещи, после каждой строки питона , который требует ввода, я типа «Hello World!» (без кавычек)

>>> raw_input()
Hello World!
'Hello World!'
>>> y = raw_input()
Hello World!
>>> print y
Hello World!
>>> 

Как насчет сочетания понятий!

>>> myvar = ''
>>> while myvar != 'exit':
...     myvar = raw_input()
...     if myvar == 'apples':
...         print "I like apples"
...     elif myvar == 'bananas':
...         print "I don't like bananas"
...     else:
...         print "I've never eaten", myvar
...
apples
I like apples
mangoes
I've never eaten mangoes
bananas
I don't like bananas
exit
I've never eaten exit
>>> 

К сожалению. немного ошибка там. Смотрите, если вы можете это исправить!

Ответил 14/06/2009 в 05:17
источник пользователем

голоса
0

Вот несколько советов, чтобы вы начали:

Среднее = Значение + Value + Value [...] / количество значений; (Например, ((2 + 5 + 3) / (3))

Многие языки программирования используют разный приоритет оператора. Когда я программирование, я всегда использовать круглые скобки, когда я не уверен, о приоритете операций. В моем примере выше, если вы только сделали 2 + 5 + 3/3, программа будет делать операции разделения перед добавлением - так было бы evaulate до + 5 2 + (3/3), или 2 + 5 + 1 == 7 ,

Пропустить это для питона пользователей / * Во- вторых: ваши самые ранние программы могут извлечь выгоду из сопзЬ корректности ( здесь есть хорошее объяснение того , что это такое и почему это КРАЙНЕ хорошая практика). Пожалуйста , прочитайте это и понять , почему вы должны использовать константы (или любой другой питон эквивалент). Также обратите внимание на «магические числа» , которая является большой областью , где используются константы. * /

Google «Пожалуйста, простите мою Дорогая тетя Салли» (Примечание: это только сделки с математическими операторами, и в основном справедливо для языков программирования, для более подробного изучения оператора старшинства, посмотрите документацию на выбранном вами языке для старшинства - также отметить, что большинство программ не имеет встроенные операторы питания, но большинство стандартных библиотек имеют POW функции).

Говоря о стандартной библиотеке: Познакомьтесь со стандартными функциями библиотеки (я никогда не использовал Python, я не знаю, как он реализует SL, но я был бы очень удивлен, если язык, который популярен не имеет хорошо развитую SL). Если вы не знаете, что это такое, и ваша книга / учебник не имеет его, получить новый. Любой ресурс, который не ссылается на стандартную библиотеку не стоит времени.

И наконец: в то время как этот пост может выглядеть, как я знаю, что я говорю, я на самом деле все еще на ранних этапах обучения, так же как и вы. Несколько вещей, которые вы могли бы хотеть, чтобы привыкнуть к ранней стадии (когда я пропустил эти части, это замедлило мое обучение много): Использование ссылок и указателей (Q для комментариев: это Python есть указатели?), Разница между данными в ячейке памяти и фактическое местоположение памяти (часто раз, местоположение значения в памяти будет более полезным, чем само значение, по крайней мере, при написании структуры данных). Особенно привыкают к стандартной библиотеке; искать для копирования, поиска и т.д. функции типа, используемые в манипуляции со строками.

На самом деле, перечитывая свой оригинальный пост, я не понял, что это было задание типа домашних заданий. Если вы не делаете это для удовольствия, вы, вероятно, никогда мой совет. Только помните, что программирование может быть очень весело, если вы не сделаете это муторно - и не расстраивайтесь, если ваш код не компилируется (или ... интерпретировать), или вы получите неожиданные результаты и т.д.

Ответил 14/06/2009 в 05:24
источник пользователем

голоса
1

Добро пожаловать в Stack Overflow!

Фокус в том, чтобы понять, что ваша программа Python должна выглядеть почти как псевдокоде.

Прежде всего, давайте попробуем разобраться, что именно делает псевдокод. Если бы мы должны были взаимодействовать с программой, описанной в псевдокоде, это будет выглядеть примерно так:

Think of a number between 1 and 1000 and press Enter.
>>> 
Is it 500? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.
>>> 1
Is it 750? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.
>>> -1
Is it 625? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.

и т.п.

Когда мы думаем о числе, программа знает только то, что она находится в пределах от 1 до 1000. Он представляет собой это знание, установив переменную «низкого» на 1 и переменную «высокого» 1000. Ее первое предположение среднее из них числа, что составляет 500.

После того, как мы говорим, что программа наше число больше, чем 500, он обновляет значение «низкий» на 501. Другими словами, то программа знает, что наш номер находится между 501 и 1000. Затем он угадывает в среднем 501 и 1000, который 750. Мы говорим это, что наше число меньше, поэтому программа обновляет значение «высокого» до 749 и угадывает в среднем 501 и 749 следующего, и так далее, пока не угадает правильно, или он сузился возможный диапазон вплоть до одного числа (то есть его следующее предположение будет правильным).

Итак, вернемся к написанию программы в Python: Мы в основном просто перевести псевдокод линию для линии. Например наш цикл программы должен выглядеть так же, как это делает в pseucode:

while high > low:
  # Guess (high + low) / 2 and ask user to respond
  # Handle user response

Там нет необходимости для цикла, как у вас есть в вашем коде.

Для того, чтобы вход мы можем сделать что-то вроде этого:

guess = (high + low) / 2
response = input('Is it ' + str(guess) + '? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.')

Теперь пользовательский ввод хранится в переменной «ответ», и мы можем обрабатывать возможности с тем, если такие заявления «если ответ == -1:», например.

Только не забудьте распечатать инструкции и установить «высокий» и «низкий» их начальные значения перед входом в то время цикла, и вы должны быть все в порядке.

Удачи!

Ответил 14/06/2009 в 06:59
источник пользователем

голоса
2

Не соответствует psudocode точно, но это работает. лол ;)

Я знаю, что это злой старый пост, но это то же самое задание я получил также. Вот то, что я закончил с:

high = 1000
low = 1
print "Pick a number between 1 and 1000."
print "I will guess your number in 10 tries or less."
print "Or at least i'll try to.  ;)"
print "My first guess is 500."
guess = 500
tries = 0
answer = 1
print "Enter 1 if it's higher."
print "Enter -1 if it's lower."
print "Enter 0 if I guessed it!"
print ""
while (answer != 0):
    answer = int(raw_input("Am I close?"))
    if answer == 1:
        tries = tries + 1
        low = guess
        guess = (high + low) / 2
        print "My next guess is:"
        print guess
    elif answer == -1:
        tries = tries + 1
        high = guess
        guess = (high + low) / 2
        print "My next guess is:"
        print guess
    elif answer == 0:
        tries = tries + 1
        print "Your number is:"
        print guess
        print "Yay! I got it! Number of guesses:"
        print tries
Ответил 25/09/2010 в 20:02
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more