Python 3: Traceback : TypeError - python

I'm new in python 3 and I don't understand why I get a Type Error (this is a guess a number game for numbers between 0-100):
print("Please think of a number between 0 and 100!")
low = 0
high = 100
check = False
while True :
guess = (low + high)/2
print("Enter 'h' to indicate the guess is too high.\n")
print("Enter 'l' to indicate the guess is too low.\n" )
print("Enter 'c' to indicate I guessed correctly.\n")
ans = input("")
if ans == "h" :
low = ans
elif ans == "l" :
high = ans
elif ans =="c" :
print( "Game over. Your secret number was:{}".format(guess))
break
else :
print("Sorry, I did not understand your input.")
here is the error :
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Thanks in advance.I'd really appreciate your help I'm stuck in this

A couple of things.
You should probably print the guess so that the user knows whether it is too high or too low
low==ans doesn't make any sense. ans will either be "h", "l", or "c", assuming the user follows the rules. low and high need to be numbers in order to generate the guess appropriately
Also your logic was incorrect. The below code works.
print("Please think of a number between 0 and 100!")
low = 0
high = 100
check = False
while True:
guess = (low + high)/2
print("My guess is: %i" % guess)
ans = input("Enter 'h' if guess it too high, 'l' if too low, or 'c' if correct: ")
print(ans)
if ans == "h":
high = guess
elif ans == "l":
low = guess
elif ans == "c":
print("Game over. Your secret number was:{}".format(guess))
break
else:
print("Sorry, I did not understand your input.")

On the line low = ans you set low to be a string value, the string value "h"
Then on the second time you pass through the loop, you try to calculate
(low + high)/2` You can't calculate ("h" + 100)/2 because you cant add the string to the integer. This is a "type error"
For each line explain to a friend (or a soft toy) what each line does and why you are certain each line is correct.

Related

Python while loop ask more than once for input

I've been trying to solve the issue with guessing the number program,
The first number the program has to print Ans which is (Startlow + Starthigh)/2 and then Ans gets updated depends on the input
I can't figure out why my while loop keeps waiting for the input for at least 2 times until it prints the results even if I press l or h (unless I press c) which breaks the loop
Startlow = 0
Starthigh = 100
Ans = (Startlow + Starthigh)/2
print("Please think of a number between 0 and 100!")
while True:
print("Is your secret number " + str(int(Ans)))
if input() == "c":
print("Game over,Your secret number was: "+str(int(Ans)))
break
elif input() == "l":
Startlow = Ans
Ans = (Startlow + Starthigh)/2
elif input() == "h":
Starthigh = Ans
Ans = (Startlow + Starthigh)/2
else:
print("Sorry, I did not understand your input.")
any help appreciated :)
You should be asking for input once in the loop, and then comparing that answer to the items you want.
You are instead requesting a (potentially different) answer at each of your conditionals.
The number of questions asked depends on how many conditionals you fall through.
Just do:
x = input()
if x == "c":
#And so on...

Cannot run code because input gives me an error

I have an exercise from the course I study from, but it gives me an error:
"Guess a number between 1 and 100: Traceback (most recent call last):
File "main.py", line 15, in <module>
guess = input("Guess a number between 1 and 100: ")
EOFError: EOF when reading a line"
How can I fix that ?
Have I done the exercise in a right way ? And just to make sure - the "break" breaks the while, right ?
# Write a program that picks a random integer from 1 to 100, and has players guess the number. The rules are:
# If a player's guess is less than 1 or greater than 100, say "OUT OF BOUNDS"
# On a player's first turn, if their guess is #within 10 of the number, return "WARM!"
# further than 10 away from the number, return "COLD!"
# On all subsequent turns, if a guess is
# closer to the number than the previous guess return "WARMER!"
# farther from the number than the previous guess, return "COLDER!"
# When the player's guess equals the number, tell them they've guessed correctly and how many guesses it took!
from random import randint
random_number = randint(1,100)
guess_count = 0
guess = input("Guess a number between 1 and 100: ")
while False:
guess_count += 1
if guess_count == 1:
if guess == random_number:
print(f'Congratulations! You have chose the correct number after the first try!')
break
else:
if abs(guess-random_number) < 11:
print("WARM!")
else:
print("COLD!")
else:
old_guess = guess
guess = input("Guess another number between 1 and 100: ")
if guess == random_number:
print(f'Congratulations! You have chose the correct number after {guess_count} tries!')
break
elif abs(random_number - guess) < abs(random_number - old_guess):
print('WARMER!')
elif abs(random_number - guess) > abs(random_number - old_guess):
print('COLDER!')
input("Press anywhere to exit ")
The reason that you are getting
Traceback (most recent call last): File "main.py", line 15, in guess = input("Guess a number between 1 and 100: ") EOFError: EOF when reading a line"
could be because you have spaces or newline before actual numbers.
Consider evaluating the user input (what if user enters a character? ) before using it. Take a look at How can I read inputs as numbers? as an example.
Also like others have pointed out, change
while False:to while True:
Hope this helps

python guess my number exercise marked wrong on edX

The program works as follows: you (the user) thinks of an integer between 0 (inclusive) and 100 (not inclusive). The computer makes guesses, and you give it input - is its guess too high or too low? Using bisection search, the computer will guess the user's secret number!
My code:
guess number using bisection
Ask for an input of number from the user
high = 100
low = 0
correct = False
response = ""
user_number = input("Please think of a number between 0 and 100!")
while (response != "c"):
guess = int((high + low)/2)
print("Is your secret number", guess, "?")
response = input("Enter 'h' to indicate the guess is too high. Enter 'l' to indicate the guess is too low. Enter 'c' to indicate I guessed correctly")
if not (response == "h" or response == "c" or response == "l"):
print("Sorry, I did not understand your input.")
elif (response is "h"):
high = guess
elif (response is "l"):
low = guess
print ("Game over. Your secret number was:", guess)
Currently the EdX website is marking my answer as incorrect, I checked the out put by trying input numbers such as 83, 8,42 it came out correctly as the edX website code's showing. Can someone give me some suggestions on where my code is flawed? Thank you.

Why does my string comparison fail on the first test?

If I enter, h or l, c It keeps prompting me to enter a number instead of going to the correct case.
print("Please think of a number between 0 and 100! ");
low = 0;
high = 100
mid = 50
while True:
print("Is your secret number " + str(mid) + "?")
guess = raw_input("Enter 'h' to indicate the guess is too high. Enter 'l' to indicate the guess is too low. Enter 'c' to indicate I guessed correctly.")
if (guess != "h") or (guess != "l") or (guess != "c"):
print "Sorry, I did not understand your input."
print "Is your secret number %i?" % mid
guess = raw_input("Enter 'h' to indicate the guess is too high. Enter 'l' to indicate the guess is too low. Enter 'c' to indicate I guessed correctly.")
elif guess == 'l':
low = mid
elif guess == 'h':
high = mid
else:
print "Game over. Your secret number was: %c" % mid
break
mid = (high + low) / 2
Your condn exp is wrong, it should be
if (guess != "h") and (guess != "l") and (guess != "c"):
This means that if the value is not h and l and c then execute. Your statement instead implied that if the input is not h or l or c then execute. So when you give h as input it fails as it is not l and c
Or as mentioned in a comment, you can instead do,
if guess not in ['h', 'l', 'c']:

Guess the number game optimization (user creates number, computer guesses)

I am very new to programming so I decided to start with Python about 4 or 5 days ago. I came across a challenge that asked for me to create a "Guess the number" game. After completion, the "hard challenge" was to create a guess the number game that the user creates the number and the computer (AI) guesses.
So far I have come up with this and it works, but it could be better and I'll explain.
from random import randint
print ("In this program you will enter a number between 1 - 100."
"\nAfter the computer will try to guess your number!")
number = 0
while number < 1 or number >100:
number = int(input("\n\nEnter a number for the computer to guess: "))
if number > 100:
print ("Number must be lower than or equal to 100!")
if number < 1:
print ("Number must be greater than or equal to 1!")
guess = randint(1, 100)
print ("The computer takes a guess...", guess)
while guess != number:
if guess > number:
guess -= 1
guess = randint(1, guess)
else:
guess += 1
guess = randint(guess, 100)
print ("The computer takes a guess...", guess)
print ("The computer guessed", guess, "and it was correct!")
This is what happened on my last run:
Enter a number for the computer to guess: 78
The computer takes a guess... 74
The computer takes a guess... 89
The computer takes a guess... 55
The computer takes a guess... 78
The computer guessed 78 and it was correct!
Notice that it works, however when the computer guessed 74, it then guessed a higher number to 89. The number is too high so the computer guesses a lower number, however the number chosen was 55. Is there a way that I can have the computer guess a number that is lower than 89, but higher than 74? Would this require additional variables or more complex if, elif, else statements?
Thank you Ryan Haining
I used the code from your reply and altered it slightly so the guess is always random. If you see this, let me know if this is the best way to do so.
from random import randint
def computer_guess(num):
low = 1
high = 100
# This will make the computer's first guess random
guess = randint(1,100)
while guess != num:
print("The computer takes a guess...", guess)
if guess > num:
high = guess
elif guess < num:
low = guess + 1
# having the next guess be after the elif statement
# will allow for the random guess to take place
# instead of the first guess being 50 each time
# or whatever the outcome of your low+high division
guess = (low+high)//2
print("The computer guessed", guess, "and it was correct!")
def main():
num = int(input("Enter a number: "))
if num < 1 or num > 100:
print("Must be in range [1, 100]")
else:
computer_guess(num)
if __name__ == '__main__':
main()
what you are looking for is the classic binary search algorithm
def computer_guess(num):
low = 1
high = 100
guess = (low+high)//2
while guess != num:
guess = (low+high)//2
print("The computer takes a guess...", guess)
if guess > num:
high = guess
elif guess < num:
low = guess + 1
print("The computer guessed", guess, "and it was correct!")
def main():
num = int(input("Enter a number: "))
if num < 1 or num > 100:
print("Must be in range [1, 100]")
else:
computer_guess(num)
if __name__ == '__main__':
main()
The algorithm works by selecting a low and high limit to start with (in your case low=1 and high=100). It then checks the midpoint between them.
If the midpoint is less than number, the midpoint becomes the new lower bound. If the midpoint is higher, it becomes the new upper bound. After doing this a new midpoint is generated between the upper and lower bound.
To illustrate an example let's say you're looking for 82.
Here's a sample run
Enter a number: 82
The computer takes a guess... 50
The computer takes a guess... 75
The computer takes a guess... 88
The computer takes a guess... 82
The computer guessed 82 and it was correct!
So what's happening here in each step?
low = 1, high = 100 => guess = 50 50 < 82 so low = 51
low = 51, high = 100 => guess = 75 75 < 82 so low = 76
low = 76, high = 100 => guess = 88 88 > 82 so high = 88
low = 76, high = 88 => guess = 82 82 == 82 and we're done.
Note that the time complexity of this is O(lg(N))
I briefly made the game which you need with follows:
import random
guess=int(input("Choose a number you want the computer to guess from 1-100: "))
turns=0
a=None
compguess=random.randint(1,100)
while turns<10 and 100>guess>=1 and compguess!=guess: #computer has 10 turns to guess number, you can change it to what you want
print("The computer's guess is: ", compguess)
if compguess>guess:
a=compguess
compguess=random.randint(1,compguess)
elif compguess<guess:
compguess=random.randint(compguess,a)
turns+=1
if compguess==guess and turns<10:
print("The computer guessed your number of:" , guess)
turns+=1
elif turns>=10 and compguess!=guess:
print("The computer couldn't guess your number, well done.")
input("")
This is a bit rusty, but you could improve it by actually narrowing down the choices so the computer has a greater chance of guessing the right number. But where would the fun in that be? Notice how in my code, if the computer guesses a number which is greater than than the number the user has inputed, it will replace 100 from the randint function with that number. So if it guesses 70 and its too high, it won't choose a number greater than 70 after that. I hope this helps, just ask if you need any more info. And tell me if it's slightly glitchy
This is how I went about mine...
__author__ = 'Ghengis Yan'
print("\t This is the age of the computer")
print("\n The computer should impress us... the Man")
import random
#User chooses the number
the_number = int(input("Human Choose a number between 0 and 100 "))
tries = 1
computer = random.randint(0,100)
# User choose again loop
while the_number > 100:
the_number = int(input("I thought Humans are smarter than that... \nRetype the number... "))
if the_number <= 100:
print("Good")
# Guessing Loop
while computer != the_number:
if computer > the_number:
print(computer, "lower... Mr. Computer")
else:
print(computer, "higher... Mr. Computer")
computer = int(random.randint(0,100))
tries += 1
print("Computer Congratulations... You beat the human! The Number was ", the_number)
print("It only took a computer such as yourself", tries, "tries to guess it right... pathetic")
input("\nPress the enter key to exit.")
What I did for the same challenge was:
1) Define a variable that records the max value input by guessing computer.
Ex:
max_guess_number = 0
2) Define another variable with the lowest guessed value.
Ex.
min_guess_number = 0
3) Added in the "if computer_guess > secret_number" clause the following code (I added -1 so that the computer wouldn't try to guess the already previously tried number):
max_guess_number = guess - 1
computer_guess = random.randint(min_guess_number, max_guess_number)
4) Added the following code in the "if computer_guess < secret_number":
min_guess_number = guess + 1
computer_guess = random.randint(min_guess_number, max_guess_number)
Worth noting is the fact that I set my while loop to loop until another variable "guess_status" changes into a value 1 (the default I set to 0). This way I actually saw the result when the while loop finished.
print 'Please think of a number between 0 and 100!'
low = 0
high = 100
while(True):
rand = (high+low)/2
print 'Is your secret number '+str(rand)+'?'
ans = raw_input("Enter 'h' to indicate the guess is too high. Enter 'l' to indicate the guess is too low. Enter 'c' to indicate I guessed correctly.")
if ans=='h':
high = rand
elif ans=='l':
low = rand
elif ans=='c':
print "Game over. Your secret number was:",rand
break
else:
print "Sorry, I did not understand your input"
You only need two new variables to keep track of the low and high limits :
low = 1
high = 100
while guess != number:
if guess > number:
high = guess - 1
else:
low = guess + 1
guess = randint(low, high)
print ("The computer takes a guess...", guess)
Try this:
import random
player = int(input("tap any number: "))
comp = random.randint(1, 100)
print(comp)
comp_down = 1
comp_up = 100
raw_input("Press Enter to continue...")
while comp != player:
if comp > player:
comp_up = comp - 1
comp = random.randint(comp_down, comp_up)
print(comp)
if comp < player:
comp_down = comp + 1
comp = random.randint(comp_down, comp_up)
print(comp)
if comp == player:
break
If you use the stuff in the chapter (guessing this is from the Dawson book) you can do it like this.
import random
#program allows computer to guess my number
#initial values
user_input1=int(input("Enter number between 1 and 100: "))
tries=1
compguess=random.randint(1, 100)
#guessing loop
while compguess != user_input1:
if compguess > user_input1:
print("Lower Guess")
compguess=random.randint(1, 100)
print(compguess)
elif compguess < user_input1:
print("Higher Guess")
compguess=random.randint(1, 100)
print(compguess)
tries += 1 #to have program add up amount of tries it takes place it in the while block
print("Good job Computer! You guessed it! The number was,", user_input1, \
" and it only took you", tries, " tries!")
import random
corr_num = random.randint(1,100)
player_tries = 0
com_tries = 0
while player_tries <5 and com_tries < 5:
player = int(input("player guess is "))
if player > corr_num:
print("too high")
player_tries +=1
if player < corr_num:
print("too low")
player_tries +=1
if player == corr_num:
print("Player wins")
break
computer = random.randint(1,100)
print("computer guess is ", computer)
if computer > corr_num:
print("too high")
com_tries = 0
if computer < corr_num:
print("too low")
com_tries = 0
if computer == corr_num:
print ("computer wins")
break
else:
print("Game over, no winner")**strong text**
import random
x = 1
y = 99
hads = random.randint(x,y)
print (hads)
javab = input('user id: ')
while javab != 'd':
if javab == 'b':
x = hads
hads = random.randint(x,y)
print(hads)
javab = input('user id: ')
else:
javab == 'k'
y = hads
hads = random.randint(x,y)
print(hads)
javab = input('user id: ')
This is the code that I created to simplify the problem you were facing a lot more.
num = int(input("Enter a number between 1 and 100: "))
low = 1
high = 100
guess = (low+high)//2
while guess != num:
guess = (low+high)//2
print("The computer takes a guess...", guess)
if guess > num:
high = guess
else:
low = guess + 1
print("The computer guessed", guess, "and it was correct!")
import random
userNum = int(input("What will the secret number be (1-100)? "))
attempts = 0
guess = 0
lowCap = 1
highCap = 100
while guess != userNum:
guess = random.randint(lowCap,highCap)
if guess > userNum:
highCap = guess
attempts += 1
elif guess < userNum:
lowCap = guess
attempts += 1
print("The computer figured out the secret number in", + attempts, "tries.")
I was doing a similar scenario today for an assignment and only now figured out how to make it easily cut down through the numbers by changing random.randint(1, 100) to random.randint(lowCap, highCap) which will change as the computer keep making guesses.

Categories