我正在尝试建立一个采用随机运算符的方程。
3×5×8×2
其中 x 表示 +、-、/* 运算符。
第二个问题:如果方程是一个字符串,golang可以评估答案吗?
(这个问题是针对这个问题http://www.reddit.com/r/dailyprogrammer/comments/1k7s7p/081313_challenge_135_easy_arithmetic_equations/ )
我正在尝试建立一个采用随机运算符的方程。
3×5×8×2
其中 x 表示 +、-、/* 运算符。
第二个问题:如果方程是一个字符串,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上运行)
让它不被不正确的表达式分解并处理非整数留给读者作为练习。
作为旁注,这些类型的挑战通常意味着开发人员的娱乐。在这里提问意味着您正在将这种乐趣转移给其他人。
Go 没有像 Perl 或 JavaScript 这样的 eval 函数。所以如果你想从一个字符串中计算一个方程,你需要编写代码来解析它并自己计算它。
(原因是 Go 是一种编译语言,它不会将编译器的副本放入每个程序中。在解释语言中添加 eval 函数比在编译语言中容易得多。)