File size: 2,592 Bytes
dbbd3ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import re
import sympy as sp

def try_math_solver(query: str) -> str:
    q = query.lower().strip()
    # Remove filler words that confuse sympy
    q = re.sub(r'\b(what is|calculate|find|compute|equals?|result of|area of|value of|solve)\b', '', q)
    q = q.strip()

    # Handle "where x = 5" style variable substitution
    variables = dict(re.findall(r'(\w+)\s*=\s*([\d\.]+)', q))
    for var in variables:
        q = re.sub(rf"\b{var}\s*=\s*{variables[var]}\b", '', q)
    q = re.sub(r'\bwhere\b', '', q)

    # Handle patterns like “add 2 and 5”
    patterns = [
        (r'addition of (\d+(?:\.\d+)?) and (\d+(?:\.\d+)?)', r'(\1 + \2)'),
        (r'add (\d+(?:\.\d+)?) and (\d+(?:\.\d+)?)', r'(\1 + \2)'),
        (r'subtract (\d+(?:\.\d+)?) from (\d+(?:\.\d+)?)', r'(\2 - \1)'),
        (r'subtract (\d+(?:\.\d+)?) and (\d+(?:\.\d+)?)', r'(\1 - \2)'),
        (r'multiply (\d+(?:\.\d+)?) by (\d+(?:\.\d+)?)', r'(\1 * \2)'),
        (r'divide (\d+(?:\.\d+)?) by (\d+(?:\.\d+)?)', r'(\1 / \2)'),
        (r'(\d+(?:\.\d+)?) power (\d+(?:\.\d+)?)', r'(\1 ** \2)'),
        (r'square root of (\d+(?:\.\d+)?)', r'sqrt(\1)'),
    ]
    for pat, repl in patterns:
        q = re.sub(pat, repl, q)

    # Replace simple words with symbols
    replacements = {
        "plus": "+", "minus": "-", "times": "*", "x": "*",
        "mod": "%", "modulus": "%", "divided by": "/",
        "power of": "**", "power": "**"
    }
    for word, sym in replacements.items():
        q = re.sub(rf"\b{word}\b", sym, q)

    # Remove assignments like “area =”
    q = re.sub(r'\b\w+\s*=\s*', '', q).strip()

    # Allow safe math functions
    allowed_funcs = {
        "sqrt": sp.sqrt, "sin": sp.sin, "cos": sp.cos, "tan": sp.tan,
        "log": sp.log, "pi": sp.pi, "e": sp.E
    }

    try:
        expr = sp.sympify(q, locals=allowed_funcs)
        if variables:
            subs = {sp.Symbol(k): float(v) for k, v in variables.items()}
            expr = expr.subs(subs)
        result = expr.evalf()
        return f"The answer is {result}"
    except Exception as e:
        return f"Sorry, couldn't solve that expression. ({e})"


if __name__ == "__main__":
    tests = [
        "addition of 2 and 5",
        "add 10 and 20",
        "what is 12 minus 5",
        "multiply 6 by 3",
        "divide 15 by 3",
        "10 power 2",
        "100 mod 3",
        "square root of 81",
        "2 + 5 * 3",
        "area = pi * r^2 where r = 5"
    ]
    for t in tests:
        print(f"{t}{try_math_solver(t)}")