aciang commited on
Commit
cf28e8a
·
verified ·
1 Parent(s): bf20f1b

Update app.py (fix README front-matter + implicit mult)

Browse files
Files changed (1) hide show
  1. app.py +14 -27
app.py CHANGED
@@ -19,21 +19,19 @@ def normalize_ascii(s: str) -> str:
19
  return s.translate(table)
20
 
21
  def auto_insert_stars(s: str) -> str:
22
- # 3x -> 3*x; x(x+1) -> x*(x+1)(x+1)x -> (x+1)*x; 2sqrt(x) -> 2*sqrt(x)
23
- s = re.sub(r'(\d)([A-Za-z])', r'\1*\2', s)
24
- s = re.sub(r'([A-Za-z0-9_])\(', r'\1*(', s)
25
- s = re.sub(r'\)([A-Za-z0-9_])', r')*\1', s)
26
- s = re.sub(r'(\d)\s*sqrt', r'\1*sqrt', s)
27
  return s
28
 
29
  def preprocess(expr: str) -> str:
30
  s = (expr or "").strip()
31
  s = normalize_ascii(s)
32
- s = s.replace("^", "**") # 2^3 -> 2**3
33
- s = auto_insert_stars(s) # 隱式乘法 顯式
34
  return s
35
 
36
- # 支援隱式乘法與 ^ 解析
37
  TRANS = standard_transformations + (implicit_multiplication_application, convert_xor)
38
 
39
  def to_sympy_expr(s: str):
@@ -48,18 +46,15 @@ def to_sympy_eq(s: str):
48
  return sp.Eq(parse_expr(L, transformations=TRANS),
49
  parse_expr(R, transformations=TRANS))
50
 
51
- # ---------------- 主邏輯(保留原介面與輸出格式) ----------------
52
  def solve_math(q: str):
53
  q = (q or "").strip()
54
  if not q:
55
  return "請輸入算式或方程,例如:2x+3=11;sin(x)^2 + cos(x)^2;factor(x^2-9)"
56
-
57
  try:
58
- # 多題/聯立:分號 ; 或換行 \n 分隔
59
  parts = [s.strip() for seg in q.split(";") for s in seg.split("\n")]
60
  parts = [p for p in parts if p]
61
 
62
- # 若任一行含 '=',啟用「解方程(可聯立)」模式
63
  if any("=" in p for p in parts):
64
  eqs, syms = [], set()
65
  for s in parts:
@@ -77,31 +72,24 @@ def solve_math(q: str):
77
  for i, d in enumerate(sol, 1)
78
  )
79
 
80
- # 否則視為單一表達式:簡化 / 因式 / 微分 / 積分
81
  expr = to_sympy_expr(q)
82
  out = []
83
- try:
84
- out.append(f"簡化:{sp.simplify(expr)}")
85
- except Exception:
86
- out.append(f"簡化:{expr}")
87
  try:
88
  fact = sp.factor(expr)
89
- if fact != expr:
90
- out.append(f"因式分解:{fact}")
91
- except Exception:
92
- pass
93
  try:
94
  x = next(iter(expr.free_symbols)) if expr.free_symbols else sp.symbols("x")
95
  out.append(f"對 {x} 微分:{sp.diff(expr, x)}")
96
  out.append(f"對 {x} 積分:{sp.integrate(expr, x)}")
97
- except Exception:
98
- pass
99
  return "\n".join(out) if out else f"結果:{expr}"
100
-
101
  except Exception as e:
102
  return f"解析失敗:{e}"
103
 
104
- # ---------------- 介面 ----------------
105
  with gr.Blocks(title=TITLE) as demo:
106
  gr.Markdown(
107
  "## " + TITLE + "\\n"
@@ -114,5 +102,4 @@ with gr.Blocks(title=TITLE) as demo:
114
  gr.Button("送出 🚀").click(fn=solve_math, inputs=q, outputs=out)
115
 
116
  if __name__ == "__main__":
117
- # Space 環境不需要 share
118
- demo.launch()
 
19
  return s.translate(table)
20
 
21
  def auto_insert_stars(s: str) -> str:
22
+ s = re.sub(r'(\d)([A-Za-z])', r'\1*\2', s) # 3x -> 3*x
23
+ s = re.sub(r'([A-Za-z0-9_])\(', r'\1*(', s) # x( -> x*(
24
+ s = re.sub(r'\)([A-Za-z0-9_])', r')*\1', s) # )x -> )*x
25
+ s = re.sub(r'(\d)\s*sqrt', r'\1*sqrt', s) # 2sqrt -> 2*sqrt
 
26
  return s
27
 
28
  def preprocess(expr: str) -> str:
29
  s = (expr or "").strip()
30
  s = normalize_ascii(s)
31
+ s = s.replace("^", "**") # 2^3 -> 2**3
32
+ s = auto_insert_stars(s) # 隱式乘法 -> 顯式
33
  return s
34
 
 
35
  TRANS = standard_transformations + (implicit_multiplication_application, convert_xor)
36
 
37
  def to_sympy_expr(s: str):
 
46
  return sp.Eq(parse_expr(L, transformations=TRANS),
47
  parse_expr(R, transformations=TRANS))
48
 
 
49
  def solve_math(q: str):
50
  q = (q or "").strip()
51
  if not q:
52
  return "請輸入算式或方程,例如:2x+3=11;sin(x)^2 + cos(x)^2;factor(x^2-9)"
 
53
  try:
 
54
  parts = [s.strip() for seg in q.split(";") for s in seg.split("\n")]
55
  parts = [p for p in parts if p]
56
 
57
+ # '=' 就走解方程(可聯立)
58
  if any("=" in p for p in parts):
59
  eqs, syms = [], set()
60
  for s in parts:
 
72
  for i, d in enumerate(sol, 1)
73
  )
74
 
75
+ # 否則當一般表達式:簡化/因式/微分/積分
76
  expr = to_sympy_expr(q)
77
  out = []
78
+ try: out.append(f"簡化:{sp.simplify(expr)}")
79
+ except Exception: out.append(f"簡化:{expr}")
 
 
80
  try:
81
  fact = sp.factor(expr)
82
+ if fact != expr: out.append(f"因式分解:{fact}")
83
+ except Exception: pass
 
 
84
  try:
85
  x = next(iter(expr.free_symbols)) if expr.free_symbols else sp.symbols("x")
86
  out.append(f"對 {x} 微分:{sp.diff(expr, x)}")
87
  out.append(f"對 {x} 積分:{sp.integrate(expr, x)}")
88
+ except Exception: pass
 
89
  return "\n".join(out) if out else f"結果:{expr}"
 
90
  except Exception as e:
91
  return f"解析失敗:{e}"
92
 
 
93
  with gr.Blocks(title=TITLE) as demo:
94
  gr.Markdown(
95
  "## " + TITLE + "\\n"
 
102
  gr.Button("送出 🚀").click(fn=solve_math, inputs=q, outputs=out)
103
 
104
  if __name__ == "__main__":
105
+ demo.launch() # Space 環境不用 share