# Maths quiz with difficulty levels

I've written this code but it's really long. I really need it to be shorter so can someone please help me! Any suggestions will be helpful.

choice=raw_input("What type of quiz do you want to do: maths or science? ")
topic=open("topic.txt", "a+")
topic.write(choice + '\n')
topic.close()
difficulty=raw_input("What difficulty do you want to play on: easy, medium or hard? ")
diff=open("difficulty.txt", "a+")
diff.write(difficulty + '\n')
diff.close()

score = 0

print("Well done, that's correct")
score+=1
else:
raw_input("Press enter to continue")
return score

def report(score):
per=str(score)*(100/5)
print("You achieved "+per+"%")
if score==5:
print("You achieved an A*")
elif score==4:
elif score==3:
elif score==2:
elif score<=1:
print("You failed")

if choice.lower() == "maths" and difficulty.lower() == "easy":
easym=open("mathseasy.txt" , "r")
print lines[0]
print lines[1]
print("A. 4"+'\n'+"B. 6")

print lines[2]
print("A. 5"+'\n'+"B. 6")

print lines[3]
print("A. 15"+'\n'+"B. 20")

print lines[4]
print("A. 13"+'\n'+"B. 15")

print lines[5]
print("A. 100"+'\n'+"B. 110")
report(fifth_score)

if choice.lower() == "maths" and difficulty.lower() == "medium":
mediumm=open("mathsmedium.txt" , "r")
print lines[0]
print lines[1]
print("A. 30"+'\n'+"B. 35")

print lines[2]
print("A. 100"+'\n'+"B. 110")

print lines[3]
print("A. 13"+'\n'+"B. 15")

print lines[4]
print("A. 30"+'\n'+"B. 32")

print lines[5]
print("A. 21"+'\n'+"B. 29")
report(fifth_score)


Here is the data in mathseasy.txt:

Welcome to the easy maths quiz.
What's 2+2?
What's 11-6?
What's 5*4?
What's 26/2?
What's 11*10?


Here is the data in mathsmedium.txt:

Welcome to the medium maths quiz.
What's 5*6?
What's 79+31?
What's 26/2?
What's 4*8?
What's 50-21?

• Isn't this basically the same as your last question? – Oscar Smith Dec 18 '17 at 20:34
• @OscarSmith new code though? – Riker Dec 18 '17 at 20:41
• @OscarSmith different code – Sᴀᴍ Onᴇᴌᴀ Dec 18 '17 at 20:47

You could try making the questions/answers declarative and then the logic surrounding the questions/answers could then be factored out. An easy way would be to store the questions/answers in a list of tuples:

data = [("What is 5+5?", 10), ("What is 10+10?", 20) ...]

• Isn't that a list of tuples? – Mast Dec 19 '17 at 5:28
• @Mast whoops don't know where my mind went. fixed. – trinth Dec 19 '17 at 19:54
• Good :-) Now I suspect there should be a ( before the second "What as well, correct? – Mast Dec 19 '17 at 19:58
• how would i then check that the useranswer is correct or not? can you do an example of the code for like the first question please – Ibibat Dec 21 '17 at 20:39

When you have a great deal of if statements that assign a second value based on a first one you can use a dictionary (look-up hash table) to summarize the associations and use just that:

def report(score):
per=str(score)*(100/5)
print("You achieved "+per+"%")
if score==5:
print("You achieved an A*")
elif score==4:
elif score==3:
elif score==2:
elif score<=1:
print("You failed")


Can become:

NUMBER_TO_LETTER = {
'5' : 'A',
'4' : 'B',
'3' : 'C',
'2' : 'D'
}

def report(score):
percentage = str(score)*(100/5)
print("You achieved "+percentage+"%")
if 2 <= score <= 5:
print("You achieved an " + NUMBER_TO_LETTER[score])
else:  # Score must be less than 1 because 5 is the max.
print("You failed.")


So you can see the data is neatly organized in a table and you can avoid repeating the same message over and over again, that can cause spelling errors (elif score==4: print("You acieved a grade B")) and makes code unnecessarily long.

Also you could note that there is an inverse relation between the letter position in the alphabet and the score so:

def report(score):