Преобразуйте игровой псевдокод в python - PullRequest
1 голос
/ 14 июня 2009

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

Псевдокод

- 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()

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

Ответы [ 7 ]

14 голосов
/ 14 июня 2009

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

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

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

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

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

Наконец, анализ случая в теле цикла требует сравнения чего-либо с ожидаемыми значениями. Хотя в некоторых других языках есть несколько способов выразить это, в python у нас есть только предложения 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 числа, и программа пытается определить среднее число для своего девятого предположения. Если это окажется неправильным, останется только одно число, и программа угадает его!

Этот метод разделения диапазона пополам и последующего перехода к более близкой половине называется делением пополам и встречается в широком диапазоне тем, представляющих интерес для информатики.


Как насчет КОДА! Поскольку я не хочу лишать вас опыта обучения, я просто дам вам несколько фрагментов, которые могут помочь вам в этом. Python - это язык, разработанный для интерактивного изучения, так что запустите переводчика и сделайте это. Я буду публиковать примеры с показанными подсказками, на самом деле не печатайте это.

Вот пример использования предложения while:

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

Получение консольного ввода от пользователя должно выполняться с помощью функции raw_input(). Он просто возвращает все, что пользователь вводит. Это немного сложнее показать. Чтобы упростить задачу, после каждой строки Python, требующей ввода, я наберу «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
>>> 

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

11 голосов
/ 14 июня 2009

Я вообще ничего не понимаю!

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

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

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

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

"print" - это инструкция Python, которая генерирует информацию; например, попробуйте программу, содержащую только

print "some information"

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

4 голосов
/ 14 июня 2009

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

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

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

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

2 голосов
/ 25 сентября 2010

Не совсем соответствует псевдокоду, но работает. смеется;)

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

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
1 голос
/ 14 июня 2009

Добро пожаловать в переполнение стека!

Хитрость в том, чтобы понять, что ваша программа на 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. Она представляет это знание, устанавливая переменную 'low' в 1 и переменную 'high' в 1000. Ее первое предположение - это среднее из этих чисел, которое составляет 500.

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

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

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

Нет необходимости в цикле for, как у вас в коде.

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

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.')

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

Просто не забудьте распечатать инструкции и установить для «high» и «low» их начальные значения перед входом в цикл while, и все будет готово.

Удачи!

1 голос
/ 14 июня 2009

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

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

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

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

  3. Как выглядят операторы "если" в Python, и как бы вы записали псевдокод как операторы?

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

high=23
low=7

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

0 голосов
/ 14 июня 2009

Вот несколько советов, с которых можно начать:

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

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

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

Google «Пожалуйста, извините мою дорогую тетю Салли» (ПРИМЕЧАНИЕ: это относится только к математическим операторам и в основном относится к языкам программирования; для более всестороннего изучения приоритета операторов посмотрите документацию выбранного языка на предмет приоритета - также обратите внимание что большинство программ не имеют встроенных операторов power, но большинство стандартных библиотек имеют функции pow).

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

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

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

...