ランダム演算子を使用する方程式を作成しようとしています。
3×5×8×2
ここで、x は +、-、/ * 演算子のいずれかを表します。
2 番目の質問: 方程式が文字列の場合、golang は答えを評価できますか?
(この質問はこの問題に関するものですhttp://www.reddit.com/r/dailyprogrammer/comments/1k7s7p/081313_challenge_135_easy_arithmetic_equations/ )
ランダム演算子を使用する方程式を作成しようとしています。
3×5×8×2
ここで、x は +、-、/ * 演算子のいずれかを表します。
2 番目の質問: 方程式が文字列の場合、golang は答えを評価できますか?
(この質問はこの問題に関するものですhttp://www.reddit.com/r/dailyprogrammer/comments/1k7s7p/081313_challenge_135_easy_arithmetic_equations/ )
ランダム演算子の生成は簡単です:
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 以外を処理することは、読者の課題として残されています。
補足として、これらの種類の課題は、通常、開発者の娯楽として意図されています。ここで質問するということは、その楽しみを他の誰かに譲渡していることを意味します。
Go には、Perl や JavaScript のような eval 関数がありません。したがって、文字列から方程式を評価する場合は、コードを記述して解析し、自分で評価する必要があります。
(これは、Go がコンパイル済み言語であり、すべてのプログラムにコンパイラーのコピーを配置するわけではないためです。コンパイル済み言語よりもインタープリター言語に eval 関数を追加する方がはるかに簡単です。)