Generating a random operator is straightforward:
rand.Seed(int64(time.Now().Unix()))
op := "+-/*"[rand.Intn(4)]
fmt.Printf("%c
", op)
(that's math/rand
)
Evaluating simple expressions in the format suggested is also easy. Here is a simplistic, inefficient, and fragile way of doing it:
expr := strings.Fields("4 * 8 / 2 * 3")
fmt.Printf("%#v
", 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
", 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])
(runnable on http://play.golang.org/p/pITy4SgXaA)
Making it not break down with improper expressions and handle non-ints is left as an exercise for the reader.
As a side note, these kinds of challenges are generally meant as entertainment for the developer. Asking here means you're transferring that fun to somebody else.