-2

ランダム演算子を使用する方程式を作成しようとしています。

3×5×8×2

ここで、x は +、-、/ * 演算子のいずれかを表します。

2 番目の質問: 方程式が文字列の場合、golang は答えを評価できますか?

(この質問はこの問題に関するものですhttp://www.reddit.com/r/dailyprogrammer/comments/1k7s7p/081313_challenge_135_easy_arithmetic_equations/ )

4

2 に答える 2

3

ランダム演算子の生成は簡単です:

    rand.Seed(int64(time.Now().Unix()))
    op := "+-/*"[rand.Intn(4)]
    fmt.Printf("%c\n", op)

(それはmath/rand)

提案された形式で単純な式を評価することも簡単です。これは、単純で非効率的で壊れやすい方法です。

expr := strings.Fields("4 * 8 / 2 * 3")
fmt.Printf("%#v\n", expr)

do := func(i int, op func(a, b int) int) {
    ai, err := strconv.Atoi(expr[i-1])
    check(err)
    bi, err := strconv.Atoi(expr[i+1])
    check(err)
    expr[i-1] = strconv.Itoa(op(ai, bi))
    expr = append(expr[:i], expr[i+2:]...)
    fmt.Printf("%#v\n", expr)
}

for _, ops := range []string{"*/", "+-"} {
    for i := 0; i < len(expr); i++ {
        if strings.Contains(ops, expr[i]) {
            switch expr[i] {
            case "*": do(i, func(a, b int) int { return a*b })
            case "/": do(i, func(a, b int) int { return a/b })
            case "+": do(i, func(a, b int) int { return a+b })
            case "-": do(i, func(a, b int) int { return a-b })
            }
            i -= 2
        }
    }
}

fmt.Println(expr[0])

( http://play.golang.org/p/pITy4SgXaAで実行可能)

不適切な式で壊れないようにすることと、int 以外を処理することは、読者の課題として残されています。

補足として、これらの種類の課題は、通常、開発者の娯楽として意図されています。ここで質問するということは、その楽しみを他の誰かに譲渡していることを意味します。

于 2013-08-24T20:35:33.147 に答える
2

Go には、Perl や JavaScript のような eval 関数がありません。したがって、文字列から方程式を評価する場合は、コードを記述して解析し、自分で評価する必要があります。

(これは、Go がコンパイル済み言語であり、すべてのプログラムにコンパイラーのコピーを配置するわけではないためです。コンパイル済み言語よりもインタープリター言語に eval 関数を追加する方がはるかに簡単です。)

于 2013-08-25T00:13:38.253 に答える