Spaces:
Sleeping
Sleeping
import gradio as gr | |
import re | |
# 题目列表 | |
questions = [ | |
"1. 37^(-42)=", | |
"2. lim_{x→0} x³/(tanx - x)=", | |
"3. cos x = x 的实根为 x=", | |
"4. f(x)=(x-1)e^(x+1)+√(2x)+1/x-ln²x 的最小值为", | |
"5. f(x)=x/6 + sinx/x 的极值点数量为", | |
"6. y=(x-e)e^x+ln²(x+1)-√(x+1) 在(0,e1)处的切线在x轴上的截距为", | |
"7. 点(1, 0)关于直线5x-2y+3=0的对称点为", | |
"8. (2+3i)^7的虚部为", | |
"9. arg(3+7i)/(9-4i)=(弧度制)", | |
"10. 5!11! mod 998244353=", | |
"11. C₃₇¹⁵=", | |
"12. (x+2)^5除以x²+x+1的商(忽略余式)为", | |
"13. 设f(x)=x⁴e^(x²)则f^(4)(x)/e^(x²)展开后x⁴的系数为", | |
"14. 102233201和123456789的最大公约数为", | |
"15. 2025的所有因数之和为", | |
"16. ∑_{n=1}^∞ n^(-n)=", | |
"17. ∫₀¹x^(-x)dx=", | |
"18. ∑_{n=1}^{25}∏_{k=1}^n(1+1/k²)=", | |
"19. (11,45,14)×(19,198,10)=", | |
"20. 以(−2,−1,−1),(−1,1,3),(2,−4,1),(2,2,0)为顶点的四面体的体积为", | |
"21. 点(1,0)到y=arctanx的距离为", | |
"22. 5¹²+8¹²的所有质因数之和为", | |
"23. 因式分解:x⁵-6x⁴+12x³-8x²-7x-1=", | |
"24. 因式分解:a³b-3a³+a²b²+2ab²-6ab+2b³=", | |
"25. √1,√2,√3,…,√2025的方差为", | |
"26. 过(−2,−1),(−1,1),(0,2),(1,−2),(3,0)的二次曲线的离心率为", | |
"27. x³-3x-5=0的复数根的实部为", | |
"28. 已知六点(−2,−27),(−1,13),(0,5),(1,3),(2,−11),(3,−7),用最小二乘法拟合直线的相关系数为", | |
"29. 以(−1,−1),(0,5),(6,2)为顶点的三角形外接圆半径为 其垂心坐标为", | |
"30. (x+2)^4(3x²-5)(x²-6x-1)的展开式中x⁴的系数为", | |
"31. 设X~N(0,0.5²),则P(-0.2≤X≤0.3)=", | |
"32. 曲线y=2^x-x²(x∈[-2,4])的长度为", | |
"33. 椭圆x²/5+y²/2=1的周长为", | |
"34. 曲线ρ=1-sinθ在点(1,0)处的曲率为", | |
"35. 曲线2x²+y²-5y+4=0和x²+2xy-3y²-2=0的所有公切线斜率之积为", | |
"36. (13579 BD)₁₅转换为10进制是", | |
"37. f(x)=1/(1-x-x²)在x=0处的泰勒展开的前6项为", | |
"38. [2025,5202]中的质数数量为", | |
"39. 已知a₁=2,aₙ₊₁=aₙ-1/aₙ,则a₂₀₂₅=", | |
"40. 已知a₁=2,a₂=3,aₙ₊₂=aₙ₊₁-1/aₙ,则a₂₀₂₅=", | |
"41. 冰雹猜想:从27开始,迭代得到1的最少次数为", | |
"42. 已知a₁=0,a₂=1,aₙ₊₂=(n+1)(aₙ+aₙ₊₁),则a₄₀₉₆ mod 998244353=", | |
"43. 已知f²(x)f'(x)=xe^x,f(2)=3,则f(0)=", | |
"44. 已知某分子和分母均小于1000的分数约等于0.294663573085847,则该分数为", | |
"45. 满足2ⁿ中不出现重复数字的最大正整数n为", | |
"46. 已知a^a+b^b+c^c+d^d=abcd(abcd为1~9的正整数),则abcd=", | |
"47. 100! mod 998244353=", | |
"48. √(eπ)小数点后第37位是", | |
"49. 已知f''(x)=2f(x)+x,f(0)=2,f'(0)=-1/2,则f(1)=", | |
"50. 3^(4^5)的各位数字之和为" | |
] | |
# 答案列表(已按题目顺序整理并统一格式) | |
answers = [ | |
"1.3662e-66", # 1 | |
"3", # 2 | |
"0.73909", # 3 | |
"0.08027", # 4 | |
"4", # 5 | |
"-1.6762", # 6 | |
"(-1.7586,1.1034)", # 7 | |
"4449", # 8 | |
"1.5841", # 9 | |
"797038588", # 10 | |
"9364199760", # 11 | |
"x³+9x²+30x+41", # 12 | |
"492", # 13 | |
"3607", # 14 | |
"3751", # 15 | |
"1.2913", # 16 | |
"1.2913", # 17 | |
"81.672", # 18 | |
"(-2322,156,1323)", # 19 | |
"15.833", # 20 | |
"0.67234", # 21 | |
"12691", # 22 | |
"(x²-3x-1)(x³-3x²+4x+1)", # 23 | |
"(a²+2b)(ab-3a+b²)", # 24 | |
"112.34", # 25 | |
"0.84984", # 26 | |
"-1.1395", # 27 | |
"0.09798", # 28 | |
"3.9841 (0.92308,2.8462)", # 29 | |
"-475", # 30 | |
"0.38117", # 31 | |
"10.750", # 32 | |
"11.613", # 33 | |
"1.0607", # 34 | |
"176", # 35 | |
"13947703", # 36 | |
"1+x+2x²+3x³+5x⁴+8x⁵", # 37 | |
"386", # 38 | |
"-35.709", # 39 | |
"-125.93", # 40 | |
"111", # 41 | |
"641190802", # 42 | |
"1.2238", # 43 | |
"127/431", # 44 | |
"29", # 45 | |
"3435", # 46 | |
"35305197", # 47 | |
"3", # 48 | |
"3.8564", # 49 | |
"2250" # 50 | |
] | |
def verify_answers(*user_answers): | |
"""验证用户答案并返回评分结果""" | |
results = [] | |
score = 0 | |
for idx, (user_ans, correct_ans) in enumerate(zip(user_answers, answers)): | |
is_correct = False | |
user_ans = str(user_ans).strip() | |
# 数值型答案验证(保留五位有效数字) | |
if re.match(r'^-?\d+\.\d+e?-?\d*$', correct_ans) or re.match(r'^-?\d+\.\d+$', correct_ans): | |
try: | |
# 统一科学计数法格式 | |
user_num = float(user_ans.replace('×10^', 'e').replace('^', 'e')) | |
correct_num = float(correct_ans.replace('×10^', 'e').replace('^', 'e')) | |
# 计算有效数字位数 | |
sig_figs = 5 - (0 if correct_num == 0 else len(str(int(abs(correct_num))))) | |
user_rounded = round(user_num, sig_figs) if sig_figs > 0 else int(round(user_num)) | |
correct_rounded = round(correct_num, sig_figs) if sig_figs > 0 else int(round(correct_num)) | |
is_correct = abs(user_rounded - correct_rounded) < 1e-4 | |
except: | |
pass | |
# 整数答案验证 | |
elif correct_ans.isdigit() and user_ans.isdigit(): | |
is_correct = user_ans == correct_ans | |
# 向量/坐标答案验证(忽略空格和中英文符号) | |
elif correct_ans.startswith('(') and correct_ans.endswith(')'): | |
user_clean = user_ans.replace(' ', '').replace(',', ',').lower() | |
correct_clean = correct_ans.replace(' ', '').replace(',', ',').lower() | |
is_correct = user_clean == correct_clean | |
# 多项式/因式分解答案验证(忽略空格和次方符号) | |
elif 'x' in correct_ans: | |
user_clean = user_ans.replace(' ', '').replace('^', '').lower() | |
correct_clean = correct_ans.replace(' ', '').replace('^', '').lower() | |
is_correct = user_clean == correct_clean | |
# 分数答案验证 | |
elif '/' in correct_ans: | |
is_correct = user_ans == correct_ans | |
# 纯文本答案验证 | |
else: | |
is_correct = user_ans == correct_ans | |
# 生成结果反馈 | |
if is_correct: | |
results.append(f"✅ 题目 {idx+1} 正确!") | |
score += 1 | |
else: | |
results.append(f"❌ 题目 {idx+1} 错误,正确答案:{correct_ans}") | |
results.append(f"------------------------\n总分:{score}/{len(questions)}") | |
return "\n".join(results) | |
# 创建Gradio界面 | |
with gr.Blocks(title="GeoGebra数学测试题", theme=gr.themes.Soft()) as app: | |
gr.Markdown("# GeoGebra数学应用能力测试") | |
gr.Markdown("### 说明:非整数答案请保留五位有效数字,直接输入数字或表达式") | |
# 动态生成题目输入框 | |
input_components = [] | |
with gr.Column(): | |
for idx, q in enumerate(questions): | |
with gr.Row(): | |
gr.Markdown(f"**{idx+1}. {q}**") | |
input_box = gr.Textbox( | |
label=f"题目 {idx+1} 答案", | |
placeholder="在此输入答案...", | |
container=False | |
) | |
input_components.append(input_box) | |
# 提交按钮与结果显示 | |
gr.Markdown("---") | |
with gr.Row(): | |
submit_btn = gr.Button("提交答案", variant="primary") | |
clear_btn = gr.Button("清空答案") | |
result_display = gr.Textbox( | |
label="答题结果", | |
lines=15, | |
placeholder="提交后将在此显示每道题的对错及总分..." | |
) | |
# 绑定事件 | |
submit_btn.click( | |
fn=verify_answers, | |
inputs=input_components, | |
outputs=result_display | |
) | |
clear_btn.click( | |
fn=lambda: [""]*len(input_components), | |
inputs=None, | |
outputs=input_components | |
) | |
# 启动应用 | |
if __name__ == "__main__": | |
app.launch(share=True) |