如何生成随机运算符,将其放在字符串中,并评估字符串

时间:2013-08-24 19:25:15

标签: go

我正在尝试建立一个采用随机算子的方程式。

3 x 5 x 8 x 2

其中x表示+, - ,/ *运算符。

第二个问题:如果等式是一个字符串,可以golang评估答案吗?

(这个问题针对这个问题http://www.reddit.com/r/dailyprogrammer/comments/1k7s7p/081313_challenge_135_easy_arithmetic_equations/

2 个答案:

答案 0 :(得分: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上运行)

让表达不正确并处理非内容不会导致读者无法理解。

作为旁注,这些挑战通常被视为开发者的娱乐。在这里问,这意味着你将这种乐趣传递给其他人。

答案 1 :(得分:2)

Go没有像Perl或JavaScript这样的eval函数。因此,如果您想从字符串中评估方程式,您需要编写代码来解析它并自己进行评估。

(原因是Go是一种编译语言,并没有将编译器的副本放到每个程序中。将eval函数添加到解释语言比编译语言要容易得多。)