/
test.go
66 lines (62 loc) · 999 Bytes
/
test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package main
import (
"fmt"
"strings"
"unicode"
)
func calc(chars []rune, start, end int) int {
r := 0
pre := 'x'
for i := start; i < end; i++ {
c := chars[i]
if i > start {
pre = chars[i-1]
}
switch c {
case '(':
depth := 1
start = i + 1
for i = start; i < end && 0 != depth; i++ {
switch chars[i] {
case '(':
depth++
case ')':
depth--
}
}
switch pre {
case 'x', '+':
r += calc(chars, start, i)
case '-':
r -= calc(chars, start, i)
}
case '+', '-':
default:
v := 0
for ; i < end && chars[i] >= '0' && chars[i] <= '9'; i++ {
v = v*10 + int(chars[i]-'0')
}
switch pre {
case 'x', '+':
r += v
case '-':
r -= v
}
}
}
return r
}
func calculate(s string) int {
s = strings.Map(func(r rune) rune {
if unicode.IsSpace(r) {
return -1
}
return r
}, s)
return calc([]rune(s), 0, len(s))
}
func main() {
s := "2-4-(8+2-6+(8+4-(1)+8-10))"
r := calculate(s)
fmt.Println(r)
}