Thiago Cafe - Programming is fun !
Created by thiago on 2017-05-01 21:36:12

Math - practicing sum

My daughters were using a website called xtramath to practice sums. It's a very nice website were lots of different sums are shuffled and asked - with time to answer, which works nice to memorize, but not to calculate.

Thinking about that, I decided to write an alternative to it without timeout and quick to write.

What should it do ?

My plans are:

  1. Ask which number should I use as operand
  2. Get numbers from 1 to 10 and shuffle them
  3. For each shuffled number, ask the result of the sum

Shuffle

I'm using the shuffling algorithm from last post (Bingo - shuffling the balls)

That was easy, let's get going.

Read a number from stdin

First, let's read a number from stdin. I don't want to ask forever, therefore we need an exit condition.

def get_number(s, exit_cond):
  while( True ):
  try:
    string = raw_input(s)
    if exit_cond(string):
      return None
    return int(string)
except:
  print 'Not a number. Try again'

Now we can simply read this number using a lambda as exit condition

exit_cond = lambda x: x in {'q', 'quit', 'leave', 'exit'}
number = get_number('Choose the number you want to practice sum: ', exit_cond)

So far, so good. Now for each number from 1 to 10, I need to ask the result of the question

Asking the question

I do not want to ask a question and give a single try. I am going to ask three times before consider it wrong. IMPORTANT: range(1, 4) in python is goes from 1 to 3

def ask_question(m, n, exit_cond):
  for i in range(1, 4):
    result = get_number(str(m) + ' + ' + str(n) + ' = ', exit_cond)
    if result == None:
      return -1

    if result == (m+n):
      print 'Correct !'
      return 1
    else:
      print 'Wrong. try again!'
      
  return 0

Main function

And the main function was basically the following

operands = shuffler.shuffle_numbers(range(1, 11))

count = 0
for operand in operands:
  ret = ask_question(number, operand, exit_cond)
  if ret == -1:
    return
  count += ret
  print ''

Colours !

The first version was monochromatic and boring. I decided to make it colourful.

With a quick search in stack overflow, I found some patterns to write decorated text to console:

class bcolors:
  HEADER = '\033[95m'
  OKBLUE = '\033[94m'
  OKGREEN = '\033[92m'
  WARNING = '\033[93m'
  FAIL = '\033[91m'
  ENDC = '\033[0m'
  BOLD = '\033[1m'
  UNDERLINE = '\033[4m'

Now I just have to add some colourful text

print bcolors.HEADER + bcolors.UNDERLINE + 'Welcome to the Thiago\'s super sum practice!' + bcolors.ENDC
# ....
total = len(operands)
if count < (int(total * .7)):
    print bcolors.WARNING + 'Try harder. You got only', count, 'correct answers' + bcolors.ENDC
else:
    print bcolors.OKGREEN + bcolors.UNDERLINE + 'Congratulations. You got', count, 'correct answers!' + bcolors.ENDC

...

Now my girls can have lots of fun with some math calculations.

Any comments or questions, compliments ?

Reach me on twitter - @thiedri

...