调用在线微软数学计算(正在完善)

目前更新了Calc函数用于计算,更新了Equation函数用于求解方程/方程组

***注意:一定要联网!这是在线运算!

***一些说明:如果结果显示为空白,则可以将TransAns函数中MaxIndex的默认值调高一些,若仍无法解决,则是目前暂时未解决的问题。

调用在线微软数学计算(正在完善)

; Author: Mono
; Time: 2022.08.10
; Online Math Solver
; Version: 0.0.1

Class Solver
{
    Static Calc(Formula, Trans := "")
    {
        Url := "https://mathsolver.microsoft.com/zh/solve-problem/"
        Url .= Formula
        
        if Trans = "Run"
        {
            Run Url
            Return
        }
        
        Return TransAns(Network_Work(Url), , "Calc")
    }
    
    Static Equation(Formula, Trans := True)
    {
        Url := "https://mathsolver.microsoft.com/zh/solve-problem/"
        Formula := StrReplace(Formula, ",", ",")
        Url .= Formula
        
        if Trans = "Run"
        {
            Run Url
            Return
        }
        
        Return TransAns(Network_Work(Url), , Trans)
    }
}

Network_Work(Url, Mode := "GET", Body := "")
{
    if Mode != "GET" || Mode != "POST"
        Mode := "GET"
    
    Whr := ComObject("WinHttp.WinHttpRequest.5.1")
    Whr.Open(Mode, Url, True)
    Whr.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36")
    Whr.SetRequestHeader("Accept", "text/html,application/xhtml xml,application/xml;q=0.9,Img/avif,Img/webp,Img/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
    Whr.SetRequestHeader("Referer", Url)
    Whr.Send(Body)
    Whr.WaitForResponse()
    
    Return Whr.ResponseText
}

TexDownload(Arr, Filename)
{
    Lst_Filename := StrSplit(Filename, ".")
    Filename := SubStr(Filename, 1, StrLen(Filename) - StrLen(Lst_Filename[-1]) - 1)
    
    For i in Arr
        Download i, (Filename "_" A_Index "." Lst_Filename[-1])
    
    Return True
}

TexUrl(Text)
{
    Url := "https://latex.codecogs.com/png.image?"
    Lst_Url := []
    Lst_Text := StrSplit(Text, "`n")
    
    For i in Lst_Text
        Lst_Url.Push(Url i)
    
    Return Lst_Url
}

TransAns(Text, MaxIndex := 300, Trans := True)
{
    ans := ""
    Text := StrReplace(Text, '<div class="hidden">', "#MST#")
    Text := StrReplace(Text, '<div class="answer">', "#MST#")
    Lst_Text := StrSplit(Text, "#MST#")
    
    if Trans == "Calc"
    {
        For i in Lst_Text
        {
            i := Trim(i)
            flag1 := SubStr(i, 1, StrLen("<!-- -->")) == "<!-- -->"
            flag2 := SubStr(i, -StrLen("</div>")) == "</div>"
            
            if flag1 && flag2
            {
                i := StrReplace(i, "<!-- -->")
                i := StrReplace(i, "</div>")
                Return i
            }
        }
    }
    
    For i in Lst_Text
    {
        i := Trim(i)
        flag1 := SubStr(i, 1, StrLen("<!-- -->")) == "<!-- -->"
        flag2 := SubStr(i, -StrLen("</div>")) == "</div>"
        flag3 := StrLen(i) < MaxIndex
        
        if flag1 && flag2 && flag3
        {
            i := StrReplace(i, "<!-- -->")
            i := StrReplace(i, "</div>")
            tmp := StrSplit(i, "=")
            
            if Trans == "Ans"
            {
                if InStr(i, "\approx")
                {
                    j := StrSplit(i, "\approx")
                    ans .= tmp[1] "≈"
                    ans .= Trim(j[-1])
                }
                
                else
                {
                    ans .= tmp[1] "="
                    ans .= tmp[-1]
                }
                
                ans .= "="
            }
            
            else if Trans
            {
                For j in tmp
                    ans .= TransTex(Trim(j)) "="
            }
            
            else
                ans .= i "="
            
            ans := SubStr(ans, 1, StrLen(ans) - 1)
            ans .= "`n"
        }
    }
    
    Return SubStr(ans, 1, StrLen(ans) - 1) 
}

TransTex(Text)
{
    ans := ""
    
    if InStr(Text, "\approx")
    {
        Text := StrReplace(Text, "\approx ", "≈")
        Text := StrReplace(Text, "\approx", "≈")
    }
    
    if InStr(Text, "\sqrt")
    {
        Text := StrReplace(Text, "\sqrt", "√")
    }
    
    if InStr(Text, "\frac")
    {   
        Text := StrReplace(Text, "{")
        Lst_Text := StrSplit(Text, "\frac")
        
        if Lst_Text[1]
        {
            if Lst_Text[1] !== "-"
                ans .= Lst_Text[1] "|"
            
            else
                ans .= "-"
        }
        
        tmp := StrSplit(Lst_Text[2], "}")
        
        For i in tmp
        {
            if A_Index < tmp.Length - 1
                ans .= i "/"
            
            else if i
                ans .= i
        }
        
        ans := SubStr(ans, 1, StrLen(ans))
    }
    
    else
        ans := Text
    
    Return ans
}
; 使用方法
msgbox Solver.Calc("12165165*84684684")
; 第二个参数若为Run,则表示在网页中打开微软数学求解该公式界面
msgbox Solver.Calc("12165165*84684684", "Run")
msgbox Solver.Equation("x+2=0")
msgbox Solver.Equaltion("x+2y=18,3x-4y=20")
; 第二个参数若为0,则表示返回值为katex格式,这个参数用于无法正常返回值时使用
msgbox Solver.Equation("x+2=0", 0)
; 第二个参数若为Run,则表示在网页中打开微软数学求解该公式界面
Solver.Equation("x^3-4x^2+x=-3", "Run")
; 第二个参数若为Ans,则只返回最终值
msgbox Solver.Equation("x^3-4x^2+x=-3", "Ans")

; 新的内容在线Tex转图
; TexUrl函数用于返回图片网址
Arr := TexUrl(Solver.Equation("x^3-4x=20", 0))
; TexDownload函数用于下载图片文件名自动加上_1、_2等后缀
TexDownload(Arr, "1.png")

给TA捐赠
共{{data.count}}人
人已捐赠
其他

对于ahk按键的一点感悟

2022-8-10 5:59:06

其他应用案例

自动切换中英文输入法

2022-8-10 17:44:18

6 条回复 A文章作者 M管理员
  1. AHK中文社区

    复杂运算能不能搞定?

    • 陌诺Mono

      可以,但格式上我没去优化,只能用tex格式显示 这个其实就是微软的math solver

    • 陌诺Mono

      你打开这个网站就知道了https://mathsolver.microsoft.com/zh/solve-problem/

  2. AHK中文社区
    1河许人给您打赏了¥10
  3. 蜜獾哥
    HoneyBadger给您打赏了¥8
  4. 薛定谔的猫

    ?逛着逛着突然脑洞大开,各路大神给了我很多思路

个人中心
购物车
优惠劵
有新私信 私信列表
搜索