-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsolution.h
More file actions
112 lines (110 loc) · 4.31 KB
/
solution.h
File metadata and controls
112 lines (110 loc) · 4.31 KB
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
Code generated by https://github.com/goodstudyqaq/leetcode-local-tester
*/
#if __has_include("../utils/cpp/help.hpp")
#include "../utils/cpp/help.hpp"
#elif __has_include("../../utils/cpp/help.hpp")
#include "../../utils/cpp/help.hpp"
#else
#define debug(...) 42
#endif
class Solution {
public:
int evaluate(string s) {
int now = 0;
int n = s.size();
function<int(map<string, int> value)> dfs = [&](map<string, int> value) -> int {
debug(now, value);
// s[now] must be (
if (s[now + 1] == 'a' || s[now + 1] == 'm') {
// add
bool is_add = (s[now + 1] == 'a');
now += 5;
if (!is_add) now++;
vector<int> v;
for (int i = 0; i < 2; i++) {
if (s[now] == '(') {
int tmp = dfs(value);
if (i == 0) {
now++;
}
v.push_back(tmp);
} else {
// name or number
if (s[now] >= 'a' && s[now] <= 'z') {
string name = "";
while ((s[now] >= 'a' && s[now] <= 'z') || (s[now] >= '0' && s[now] <= '9')) {
name += s[now];
now++;
}
v.push_back(value[name]);
} else {
int flag = 1;
if (s[now] == '-') flag = -1, now++;
int val = 0;
while (s[now] >= '0' && s[now] <= '9') val = val * 10 + s[now] - '0', now++;
v.push_back(val * flag);
}
if (i == 0) {
now++;
}
}
}
now++;
debug(v);
if (is_add)
return v[0] + v[1];
else
return v[0] * v[1];
} else {
// let
now += 5;
while (true) {
if (s[now] == '(') {
int val = dfs(value);
now++;
return val;
} else if (s[now] >= 'a' && s[now] <= 'z') {
string name;
while ((s[now] >= 'a' && s[now] <= 'z') || (s[now] >= '0' && s[now] <= '9')) {
name += s[now];
now++;
}
if (s[now] == ')') {
int res = value[name];
now++;
return res;
}
now++;
if (s[now] == '(') {
int val = dfs(value);
value[name] = val;
} else if ((s[now] >= '0' && s[now] <= '9') || s[now] == '-') {
int val = 0;
int flag = 1;
if (s[now] == '-') flag = -1, now++;
while (s[now] >= '0' && s[now] <= '9') val = val * 10 + s[now] - '0', now++;
value[name] = val * flag;
} else {
string name2 = "";
while ((s[now] >= 'a' && s[now] <= 'z') || (s[now] >= '0' && s[now] <= '9')) {
name2 += s[now];
now++;
}
value[name] = value[name2];
}
now++;
} else if ((s[now] >= '0' && s[now] <= '9') || s[now] == '-') {
int flag = 1;
if (s[now] == '-') flag = -1, now++;
int val = 0;
while (s[now] >= '0' && s[now] <= '9') val = val * 10 + s[now] - '0', now++;
now++;
return val * flag;
}
}
}
};
return dfs({});
}
};