File size: 2,943 Bytes
3e7998b
2f94119
 
 
3e7998b
2f94119
3e7998b
 
 
 
19d3674
3e7998b
19d3674
3e7998b
19d3674
 
 
 
 
 
 
 
3e7998b
 
 
 
19d3674
 
 
3e7998b
19d3674
 
 
 
3e7998b
19d3674
 
 
3e7998b
 
 
19d3674
3e7998b
 
19d3674
 
 
3e7998b
8a4e70b
19d3674
3e7998b
19d3674
 
2f94119
19d3674
 
3e7998b
19d3674
 
8a4e70b
19d3674
 
 
3e7998b
 
19d3674
3e7998b
 
19d3674
 
3e7998b
 
19d3674
 
 
3e7998b
 
2f94119
3e7998b
19d3674
3e7998b
19d3674
 
 
2f94119
 
19d3674
 
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
\
import gradio as gr
import sympy as sp

TITLE = "LanguageBridge — Math Fast Agent (SymPy)"

def solve_math(q: str):
    q = (q or "").strip()
    if not q:
        return "請輸入算式或方程,例如:2x+3=11;或:sin(x)**2 + cos(x)**2;或:factor(x**2-9)"

    try:
        # 情境 A:含 '=' → 視為(可能多條)方程,支援分號/換行分隔
        if "=" in q:
            # 將多行與分號斷開
            parts = []
            for seg in q.split(";"):
                parts += [s.strip() for s in seg.split("\n")]
            parts = [s for s in parts if s]

            eqs = []
            syms = set()
            for s in parts:
                if "=" not in s:
                    continue
                left, right = s.split("=", 1)
                L = sp.sympify(left)
                R = sp.sympify(right)
                eq = sp.Eq(L, R)
                eqs.append(eq)
                syms |= L.free_symbols | R.free_symbols

            if not eqs:
                return "沒有可解析的方程式。"
            if not syms:
                syms = {sp.symbols("x")}

            # 解聯立(回傳 dict 列表)
            sol = sp.solve(eqs, list(syms), dict=True)
            if not sol:
                return "無解或需要更多條件。"

            lines = []
            for i, s in enumerate(sol, 1):
                lines.append(
                    "解 {}: ".format(i) + ", ".join(f"{k} = {sp.simplify(v)}" for k, v in s.items())
                )
            return "\n".join(lines)

        # 情境 B:純表達式 → 嘗試簡化、因式、微分、積分
        expr = sp.sympify(q)
        out = []

        try:
            simp = sp.simplify(expr)
            out.append(f"簡化:{simp}")
        except Exception:
            pass

        try:
            fac = sp.factor(expr)
            if fac != expr:
                out.append(f"因式分解:{fac}")
        except Exception:
            pass

        try:
            x = list(expr.free_symbols)[0] if expr.free_symbols else sp.symbols("x")
            out.append(f"對 {x} 微分:{sp.diff(expr, x)}")
            out.append(f"對 {x} 積分:{sp.integrate(expr, x)}")
        except Exception:
            pass

        return "\n".join(out) if out else f"結果:{expr}"

    except Exception as e:
        return f"解析失敗:{e}"

with gr.Blocks(title=TITLE) as demo:
    gr.Markdown(f"## {TITLE}\n- 貼上**算式/方程**(可多行;或用分號 `;` 分隔聯立)\n- 範例:`2x+3=11`、`x+y=3; x-y=1`、`sin(x)**2 + cos(x)**2`、`factor(x**2-9)`")
    q = gr.Textbox(lines=6, label="題目 / 算式(可含聯立方程)")
    out = gr.Textbox(lines=12, label="輸出")
    btn = gr.Button("送出 🚀")
    btn.click(solve_math, q, out)

if __name__ == "__main__":
    # 在 Colab 預覽:一定要 share=True 才會印出 public URL
    demo.launch(share=True)