a third through Step Generator
This commit is contained in:
@@ -4,17 +4,26 @@
|
||||
import random
|
||||
from sympy import *
|
||||
|
||||
TEMPLATES = {}
|
||||
|
||||
def register_problem_generator(problem_type):
|
||||
def decorator(func):
|
||||
TEMPLATES[problem_type] = func
|
||||
return func
|
||||
return decorator
|
||||
|
||||
@register_problem_generator("linear")
|
||||
def generate_linear():
|
||||
#ax + b = c
|
||||
a = random.choice([i for i in range(-10, 16) if i != 0])
|
||||
ans = random.choice([i for i in range(-10, 11)])
|
||||
b = random.choice([i for i in range(-10, 11)])
|
||||
b = random.choice([i for i in range(-10, 11) if a != 1 or i != 0])
|
||||
|
||||
c = a * ans + b
|
||||
x = symbols('x')
|
||||
expr = a * x + b
|
||||
# expanded = n
|
||||
s = normalize(expr)
|
||||
s = sstr(expr)
|
||||
|
||||
return {
|
||||
"type": "linear",
|
||||
@@ -22,20 +31,21 @@ def generate_linear():
|
||||
"solution": ans
|
||||
}
|
||||
|
||||
@register_problem_generator("hidden_factor")
|
||||
def generate_hidden_factor():
|
||||
#a(x + b) + c(x + b) = d
|
||||
ans = random.choice([i for i in range(-10, 16)])
|
||||
b = random.choice([i for i in range(-5, 6) if i != 0])
|
||||
|
||||
a = random.choice([i for i in range(-5, 6) if i != 0])
|
||||
c = random.choice([i for i in range(-5, 6) if i != 0])
|
||||
c = random.choice([i for i in range(-5, 6) if i != 0 and i != -a])
|
||||
|
||||
x = symbols('x')
|
||||
inner_expr = x + b
|
||||
inner_value = ans + b
|
||||
right_side = a * inner_value + c * inner_value
|
||||
|
||||
problem = f"{a}({normalize(inner_expr)}) + {c}({normalize(inner_expr)}) = {right_side}"
|
||||
problem = f"{a}({sstr(inner_expr)}) + {c}({sstr(inner_expr)}) = {right_side}"
|
||||
|
||||
return {
|
||||
"type": "hidden_factor",
|
||||
@@ -43,6 +53,7 @@ def generate_hidden_factor():
|
||||
"solution": ans
|
||||
}
|
||||
|
||||
@register_problem_generator("distribution")
|
||||
def generate_distribution ():
|
||||
#a(x + b) = c
|
||||
ans = random.choice([i for i in range(-10, 16)])
|
||||
@@ -55,10 +66,11 @@ def generate_distribution ():
|
||||
|
||||
return {
|
||||
"type": "distribution",
|
||||
"problem": f"{a}({normalize(inner_expr)}) = {c}",
|
||||
"problem": f"{a}({sstr(inner_expr)}) = {c}",
|
||||
"solution": ans
|
||||
}
|
||||
|
||||
@register_problem_generator("two_sides")
|
||||
def generate_two_sides ():
|
||||
#ax + b = dx + e : a != d
|
||||
ans = random.choice([i for i in range(-10, 16)])
|
||||
@@ -73,10 +85,11 @@ def generate_two_sides ():
|
||||
|
||||
return {
|
||||
"type": "two_sides",
|
||||
"problem": f"{normalize(left_exp)} = {normalize(right_exp)}",
|
||||
"problem": f"{sstr(left_exp)} = {sstr(right_exp)}",
|
||||
"solution": ans
|
||||
}
|
||||
|
||||
@register_problem_generator("like_terms")
|
||||
def generate_like_terms ():
|
||||
#ax + bx + c = d
|
||||
ans = random.choice([i for i in range(-10, 16)])
|
||||
@@ -90,10 +103,11 @@ def generate_like_terms ():
|
||||
|
||||
return {
|
||||
"type": "like_terms",
|
||||
"problem": f"{normalize(expr)} = {d}",
|
||||
"problem": f"{sstr(expr)} = {d}",
|
||||
"solution": ans
|
||||
}
|
||||
|
||||
@register_problem_generator("quadratic")
|
||||
def generate_quadratic ():
|
||||
#ax² + bx + c = 0
|
||||
r1 = random.choice([i for i in range(-10, 16)])
|
||||
@@ -103,7 +117,7 @@ def generate_quadratic ():
|
||||
|
||||
x = symbols('x')
|
||||
expr = n *(x - r1) * (x - r2)
|
||||
expr = simplify(expr)
|
||||
expr = expand(expr)
|
||||
if r1 == r2:
|
||||
solution = r1
|
||||
else:
|
||||
@@ -111,10 +125,11 @@ def generate_quadratic ():
|
||||
|
||||
return {
|
||||
"type": "quadratic",
|
||||
"problem": f"{normalize(expr)} = 0",
|
||||
"problem": f"{sstr(expr)} = 0",
|
||||
"solution": solution
|
||||
}
|
||||
|
||||
@register_problem_generator("difference_squares")
|
||||
def generate_difference_squares ():
|
||||
#x² - a² = 0
|
||||
ans = random.choice([i for i in range(0, 13)])
|
||||
@@ -130,10 +145,11 @@ def generate_difference_squares ():
|
||||
|
||||
return {
|
||||
"type": "difference_squares",
|
||||
"problem": f"{normalize(expr)} = 0",
|
||||
"problem": f"{sstr(expr)} = 0",
|
||||
"solution": solution
|
||||
}
|
||||
|
||||
@register_problem_generator("zero_product")
|
||||
def generate_zero_product ():
|
||||
#(x + a)(x + b) = 0
|
||||
a = random.choice([i for i in range(-5, 6)])
|
||||
@@ -144,10 +160,11 @@ def generate_zero_product ():
|
||||
|
||||
return {
|
||||
"type": "zero_product",
|
||||
"problem": f"{normalize(expr)} = 0",
|
||||
"problem": f"{sstr(expr)} = 0",
|
||||
"solution": [-a, -b]
|
||||
}
|
||||
|
||||
@register_problem_generator("radical")
|
||||
def generate_radical ():
|
||||
#√(x + a) = b
|
||||
a = random.choice([i for i in range(-10, 16)])
|
||||
@@ -159,10 +176,11 @@ def generate_radical ():
|
||||
|
||||
return {
|
||||
"type": "radical",
|
||||
"problem": f"{normalize(expr)} = {b}",
|
||||
"problem": f"{sstr(expr)} = {b}",
|
||||
"solution": ans
|
||||
}
|
||||
|
||||
@register_problem_generator("fraction")
|
||||
def generate_fraction ():
|
||||
#(x/a) + b = c
|
||||
a = random.choice([i for i in range(-7, 8) if i != 0 and i != 1])
|
||||
@@ -175,10 +193,11 @@ def generate_fraction ():
|
||||
|
||||
return {
|
||||
"type": "fraction",
|
||||
"problem": f"{normalize(expr)} = {c}",
|
||||
"problem": f"{sstr(expr)} = {c}",
|
||||
"solution": ans
|
||||
}
|
||||
|
||||
@register_problem_generator("binomial")
|
||||
def generate_binomial ():
|
||||
#a(x + b) + c(x + d) = e
|
||||
ans = random.choice([i for i in range(-15, 16)])
|
||||
@@ -197,12 +216,13 @@ def generate_binomial ():
|
||||
|
||||
return {
|
||||
"type": "binomial",
|
||||
"problem": f"{normalize(expr)} = {e}",
|
||||
"problem": f"{sstr(expr)} = {e}",
|
||||
"solution": ans
|
||||
}
|
||||
|
||||
@register_problem_generator("tricky")
|
||||
def generate_tricky ():
|
||||
#generate random numbers
|
||||
#(x² - x - a) / (x + b) = c
|
||||
n = random.choice([i for i in range(-5, 6) if i != 0])
|
||||
r1 = random.choice([i for i in range(-10, 16)])
|
||||
r2 = random.choice([i for i in range(-10, 16) if i != r1])
|
||||
@@ -214,7 +234,7 @@ def generate_tricky ():
|
||||
expanded = expanded - expr
|
||||
expanded = expanded / (x - r1)
|
||||
# expanded = n
|
||||
s = normalize(expanded)
|
||||
s = sstr(expanded)
|
||||
|
||||
return {
|
||||
"type": "tricky",
|
||||
@@ -222,24 +242,15 @@ def generate_tricky ():
|
||||
"solution": r2
|
||||
}
|
||||
|
||||
def normalize(expr):
|
||||
return sstr(expr).replace("**", "^")
|
||||
|
||||
def generate_problem():
|
||||
template = random.choice(TEMPLATES)
|
||||
return template()
|
||||
types = list(TEMPLATES.keys())
|
||||
#print(types)
|
||||
# ['linear', 'hidden_factor', 'distribution', 'two_sides', 'like_terms', 'quadratic', 'difference_squares', 'zero_product', 'radical', 'fraction', 'binomial', 'tricky']
|
||||
weights = [0.80 , 0.90 , 0.70 , 1.00 , 0.9 , 1.0 , 0.80 , 0.70 , 0.70 , 1.00 , 1.00 , 0.65]
|
||||
|
||||
TEMPLATES = [
|
||||
generate_linear,
|
||||
generate_hidden_factor,
|
||||
generate_distribution,
|
||||
generate_two_sides,
|
||||
generate_like_terms,
|
||||
generate_quadratic,
|
||||
generate_difference_squares,
|
||||
generate_zero_product,
|
||||
generate_radical,
|
||||
generate_fraction,
|
||||
generate_binomial,
|
||||
generate_tricky
|
||||
]
|
||||
problem_type = random.choices(types, weights=weights)[0]
|
||||
template = TEMPLATES[problem_type]
|
||||
return generate_like_terms()
|
||||
#return template()
|
||||
|
||||
Reference in New Issue
Block a user