fork download
  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3.  
  4. import random
  5.  
  6. OPERATORS = ('+', '-', '*', '/')
  7. EASY = 1
  8. MEDIUM = 2
  9. HARD = 3
  10.  
  11.  
  12. class BinaryExpression():
  13.  
  14. def __init__(self, left, op, right):
  15. self.left = left
  16. self.op = op
  17. self.right = right
  18.  
  19. def __get_result(self):
  20. return eval('%s' % self)
  21.  
  22. def get_expression_str(self, result):
  23. return '%s=%s' % (self, result)
  24.  
  25. def get_true_expression(self):
  26. return self.get_expression_str(self.__get_result())
  27.  
  28. def get_false_expression(self):
  29. digits = len(str(self.__get_result()))
  30. result = random.randint(10 * (digits - 1), 10 ** digits)
  31. # A little chance exists that true answer will be generated.
  32. while result == self.__get_result():
  33. result = random.randint(10 * (digits - 1), 10 ** digits)
  34. return self.get_expression_str(result)
  35.  
  36. def __str__(self):
  37. return '%d%s%d' % (self.left, self.op, self.right)
  38.  
  39.  
  40. def get_easy_expression():
  41. expression_type = random.random()
  42. if expression_type <= 0.75:
  43. left = random.randint(0, 10)
  44. right = random.randint(0, 10)
  45. op = random.choice(OPERATORS[:3])
  46. else:
  47. right = 2
  48. left = right * random.randint(0, 51)
  49. op = OPERATORS[3]
  50.  
  51. return left, op, right
  52.  
  53.  
  54. def get_medium_expression():
  55. expression_type = random.random()
  56. if expression_type <= 0.5:
  57. left = random.randint(-100, 100)
  58. right = random.randint(0, 100)
  59. op = random.choice(OPERATORS[:2])
  60. elif expression_type <= 0.75:
  61. left = random.randint(-10, 10)
  62. right = random.randint(0, 15)
  63. op = OPERATORS[2]
  64. else:
  65. right = random.randint(1, 10)
  66. left = right * random.randint(0, 100)
  67. op = OPERATORS[3]
  68. return left, op, right
  69.  
  70.  
  71. def get_hard_expression():
  72. expression_type = random.random()
  73. if expression_type <= 0.5:
  74. left = random.randint(-1000, 1000)
  75. right = random.randint(0, 1000)
  76. op = random.choice(OPERATORS[:2])
  77. elif expression_type <= 0.75:
  78. left = random.randint(0, 100)
  79. right = random.randint(0, 100)
  80. op = OPERATORS[2]
  81. else:
  82. right = random.randint(1, 100)
  83. left = right * random.randint(0, 100)
  84. op = OPERATORS[3]
  85. return left, op, right
  86.  
  87.  
  88. def get_expression(truth, difficulty):
  89. if difficulty is EASY:
  90. left, op, right = get_easy_expression()
  91. elif difficulty is MEDIUM:
  92. left, op, right = get_medium_expression()
  93. else:
  94. left, op, right = get_hard_expression()
  95.  
  96. exp = BinaryExpression(left, op, right)
  97. if truth:
  98. return exp.get_true_expression()
  99. else:
  100. return exp.get_false_expression()
  101.  
  102.  
  103. if __name__ == '__main__':
  104. print get_expression(True, EASY)
  105. print get_expression(False, EASY)
  106. print get_expression(True, MEDIUM)
  107. print get_expression(False, MEDIUM)
  108. print get_expression(True, HARD)
  109. print get_expression(False, HARD)
Success #stdin #stdout 0.01s 10024KB
stdin
Standard input is empty
stdout
4*10=40
60/2=38
-49+38=-11
8*4=37
39+464=503
900+923=4935