#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import random
OPERATORS = ('+', '-', '*', '/')
EASY = 1
MEDIUM = 2
HARD = 3
class BinaryExpression():
def __init__(self, left, op, right):
self.left = left
self.op = op
self.right = right
def __get_result(self):
return eval('%s' % self)
def get_expression_str(self, result):
return '%s=%s' % (self, result)
def get_true_expression(self):
return self.get_expression_str(self.__get_result())
def get_false_expression(self):
digits = len(str(self.__get_result()))
result = random.randint(10 * (digits - 1), 10 ** digits)
# A little chance exists that true answer will be generated.
while result == self.__get_result():
result = random.randint(10 * (digits - 1), 10 ** digits)
return self.get_expression_str(result)
def __str__(self):
return '%d%s%d' % (self.left, self.op, self.right)
def get_easy_expression():
expression_type = random.random()
if expression_type <= 0.75:
left = random.randint(0, 10)
right = random.randint(0, 10)
op = random.choice(OPERATORS[:3])
else:
right = 2
left = right * random.randint(0, 51)
op = OPERATORS[3]
return left, op, right
def get_medium_expression():
expression_type = random.random()
if expression_type <= 0.5:
left = random.randint(-100, 100)
right = random.randint(0, 100)
op = random.choice(OPERATORS[:2])
elif expression_type <= 0.75:
left = random.randint(-10, 10)
right = random.randint(0, 15)
op = OPERATORS[2]
else:
right = random.randint(1, 10)
left = right * random.randint(0, 100)
op = OPERATORS[3]
return left, op, right
def get_hard_expression():
expression_type = random.random()
if expression_type <= 0.5:
left = random.randint(-1000, 1000)
right = random.randint(0, 1000)
op = random.choice(OPERATORS[:2])
elif expression_type <= 0.75:
left = random.randint(0, 100)
right = random.randint(0, 100)
op = OPERATORS[2]
else:
right = random.randint(1, 100)
left = right * random.randint(0, 100)
op = OPERATORS[3]
return left, op, right
def get_expression(truth, difficulty):
if difficulty is EASY:
left, op, right = get_easy_expression()
elif difficulty is MEDIUM:
left, op, right = get_medium_expression()
else:
left, op, right = get_hard_expression()
exp = BinaryExpression(left, op, right)
if truth:
return exp.get_true_expression()
else:
return exp.get_false_expression()
if __name__ == '__main__':
print get_expression(True, EASY)
print get_expression(False, EASY)
print get_expression(True, MEDIUM)
print get_expression(False, MEDIUM)
print get_expression(True, HARD)
print get_expression(False, HARD)
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogVVRGLTggLSotCgppbXBvcnQgcmFuZG9tCgpPUEVSQVRPUlMgPSAoJysnLCAnLScsICcqJywgJy8nKQpFQVNZID0gMQpNRURJVU0gPSAyCkhBUkQgPSAzCgoKY2xhc3MgQmluYXJ5RXhwcmVzc2lvbigpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0LCBvcCwgcmlnaHQpOgogICAgICAgIHNlbGYubGVmdCA9IGxlZnQKICAgICAgICBzZWxmLm9wID0gb3AKICAgICAgICBzZWxmLnJpZ2h0ID0gcmlnaHQKCiAgICBkZWYgX19nZXRfcmVzdWx0KHNlbGYpOgogICAgICAgIHJldHVybiBldmFsKCclcycgJSBzZWxmKQoKICAgIGRlZiBnZXRfZXhwcmVzc2lvbl9zdHIoc2VsZiwgcmVzdWx0KToKICAgICAgICByZXR1cm4gJyVzPSVzJyAlIChzZWxmLCByZXN1bHQpCgogICAgZGVmIGdldF90cnVlX2V4cHJlc3Npb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2V4cHJlc3Npb25fc3RyKHNlbGYuX19nZXRfcmVzdWx0KCkpCgogICAgZGVmIGdldF9mYWxzZV9leHByZXNzaW9uKHNlbGYpOgogICAgICAgIGRpZ2l0cyA9IGxlbihzdHIoc2VsZi5fX2dldF9yZXN1bHQoKSkpCiAgICAgICAgcmVzdWx0ID0gcmFuZG9tLnJhbmRpbnQoMTAgKiAoZGlnaXRzIC0gMSksIDEwICoqIGRpZ2l0cykKICAgICAgICAjIEEgbGl0dGxlIGNoYW5jZSBleGlzdHMgdGhhdCB0cnVlIGFuc3dlciB3aWxsIGJlIGdlbmVyYXRlZC4KICAgICAgICB3aGlsZSByZXN1bHQgPT0gc2VsZi5fX2dldF9yZXN1bHQoKToKICAgICAgICAgICAgcmVzdWx0ID0gcmFuZG9tLnJhbmRpbnQoMTAgKiAoZGlnaXRzIC0gMSksIDEwICoqIGRpZ2l0cykKICAgICAgICByZXR1cm4gc2VsZi5nZXRfZXhwcmVzc2lvbl9zdHIocmVzdWx0KQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJWQlcyVkJyAlIChzZWxmLmxlZnQsIHNlbGYub3AsIHNlbGYucmlnaHQpCgoKZGVmIGdldF9lYXN5X2V4cHJlc3Npb24oKToKICAgIGV4cHJlc3Npb25fdHlwZSA9IHJhbmRvbS5yYW5kb20oKQogICAgaWYgZXhwcmVzc2lvbl90eXBlIDw9IDAuNzU6CiAgICAgICAgbGVmdCA9IHJhbmRvbS5yYW5kaW50KDAsIDEwKQogICAgICAgIHJpZ2h0ID0gcmFuZG9tLnJhbmRpbnQoMCwgMTApCiAgICAgICAgb3AgPSByYW5kb20uY2hvaWNlKE9QRVJBVE9SU1s6M10pCiAgICBlbHNlOgogICAgICAgIHJpZ2h0ID0gMgogICAgICAgIGxlZnQgPSByaWdodCAqIHJhbmRvbS5yYW5kaW50KDAsIDUxKQogICAgICAgIG9wID0gT1BFUkFUT1JTWzNdCgogICAgcmV0dXJuIGxlZnQsIG9wLCByaWdodAoKCmRlZiBnZXRfbWVkaXVtX2V4cHJlc3Npb24oKToKICAgIGV4cHJlc3Npb25fdHlwZSA9IHJhbmRvbS5yYW5kb20oKQogICAgaWYgZXhwcmVzc2lvbl90eXBlIDw9IDAuNToKICAgICAgICBsZWZ0ID0gcmFuZG9tLnJhbmRpbnQoLTEwMCwgMTAwKQogICAgICAgIHJpZ2h0ID0gcmFuZG9tLnJhbmRpbnQoMCwgMTAwKQogICAgICAgIG9wID0gcmFuZG9tLmNob2ljZShPUEVSQVRPUlNbOjJdKQogICAgZWxpZiBleHByZXNzaW9uX3R5cGUgPD0gMC43NToKICAgICAgICBsZWZ0ID0gcmFuZG9tLnJhbmRpbnQoLTEwLCAxMCkKICAgICAgICByaWdodCA9IHJhbmRvbS5yYW5kaW50KDAsIDE1KQogICAgICAgIG9wID0gT1BFUkFUT1JTWzJdCiAgICBlbHNlOgogICAgICAgIHJpZ2h0ID0gcmFuZG9tLnJhbmRpbnQoMSwgMTApCiAgICAgICAgbGVmdCA9IHJpZ2h0ICogcmFuZG9tLnJhbmRpbnQoMCwgMTAwKQogICAgICAgIG9wID0gT1BFUkFUT1JTWzNdCiAgICByZXR1cm4gbGVmdCwgb3AsIHJpZ2h0CgoKZGVmIGdldF9oYXJkX2V4cHJlc3Npb24oKToKICAgIGV4cHJlc3Npb25fdHlwZSA9IHJhbmRvbS5yYW5kb20oKQogICAgaWYgZXhwcmVzc2lvbl90eXBlIDw9IDAuNToKICAgICAgICBsZWZ0ID0gcmFuZG9tLnJhbmRpbnQoLTEwMDAsIDEwMDApCiAgICAgICAgcmlnaHQgPSByYW5kb20ucmFuZGludCgwLCAxMDAwKQogICAgICAgIG9wID0gcmFuZG9tLmNob2ljZShPUEVSQVRPUlNbOjJdKQogICAgZWxpZiBleHByZXNzaW9uX3R5cGUgPD0gMC43NToKICAgICAgICBsZWZ0ID0gcmFuZG9tLnJhbmRpbnQoMCwgMTAwKQogICAgICAgIHJpZ2h0ID0gcmFuZG9tLnJhbmRpbnQoMCwgMTAwKQogICAgICAgIG9wID0gT1BFUkFUT1JTWzJdCiAgICBlbHNlOgogICAgICAgIHJpZ2h0ID0gcmFuZG9tLnJhbmRpbnQoMSwgMTAwKQogICAgICAgIGxlZnQgPSByaWdodCAqIHJhbmRvbS5yYW5kaW50KDAsIDEwMCkKICAgICAgICBvcCA9IE9QRVJBVE9SU1szXQogICAgcmV0dXJuIGxlZnQsIG9wLCByaWdodAoKCmRlZiBnZXRfZXhwcmVzc2lvbih0cnV0aCwgZGlmZmljdWx0eSk6CiAgICBpZiBkaWZmaWN1bHR5IGlzIEVBU1k6CiAgICAgICAgbGVmdCwgb3AsIHJpZ2h0ID0gZ2V0X2Vhc3lfZXhwcmVzc2lvbigpCiAgICBlbGlmIGRpZmZpY3VsdHkgaXMgTUVESVVNOgogICAgICAgIGxlZnQsIG9wLCByaWdodCA9IGdldF9tZWRpdW1fZXhwcmVzc2lvbigpCiAgICBlbHNlOgogICAgICAgIGxlZnQsIG9wLCByaWdodCA9IGdldF9oYXJkX2V4cHJlc3Npb24oKQoKICAgIGV4cCA9IEJpbmFyeUV4cHJlc3Npb24obGVmdCwgb3AsIHJpZ2h0KQogICAgaWYgdHJ1dGg6CiAgICAgICAgcmV0dXJuIGV4cC5nZXRfdHJ1ZV9leHByZXNzaW9uKCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIGV4cC5nZXRfZmFsc2VfZXhwcmVzc2lvbigpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHByaW50IGdldF9leHByZXNzaW9uKFRydWUsIEVBU1kpCiAgICBwcmludCBnZXRfZXhwcmVzc2lvbihGYWxzZSwgRUFTWSkKICAgIHByaW50IGdldF9leHByZXNzaW9uKFRydWUsIE1FRElVTSkKICAgIHByaW50IGdldF9leHByZXNzaW9uKEZhbHNlLCBNRURJVU0pCiAgICBwcmludCBnZXRfZXhwcmVzc2lvbihUcnVlLCBIQVJEKQogICAgcHJpbnQgZ2V0X2V4cHJlc3Npb24oRmFsc2UsIEhBUkQp