1
/**
2
* @param {string} expression
3
* @return {number}
4
*/
5
var evaluate = function (expression) {
6
return helper(expression);
7
};
8

9
const helper = (expr, map = {}) => {
10
if (expr[0] !== "(") return /[0-9]|-/.test(expr[0]) ? +expr : map[expr];
11

12
map = Object.assign({}, map);
13
const start = expr[1] === "m" ? 6 : 5;
14
const tokens = parse(expr.slice(start, expr.length - 1));
15

16
if (expr.startsWith("(m"))
17
return helper(tokens[0], map) * helper(tokens[1], map);
18
if (expr.startsWith("(a"))
19
return helper(tokens[0], map) + helper(tokens[1], map);
20

21
for (let i = 0; i < tokens.length - 2; i += 2)
22
map[tokens[i]] = helper(tokens[i + 1], map);
23

24
return helper(tokens.at(-1), map);
25
};
26

27
const parse = (expr) => {
28
const tokens = [];
29
let [builder, par] = ["", 0];
30

31
for (let ch of expr) {
32
if (ch === "(") par++;
33
if (ch === ")") par--;
34
if (!par && ch === " ") {
35
tokens.push(builder);
36
builder = "";
37
} else builder += ch;
38
}
39

40
return builder ? [...tokens, builder] : tokens;
41
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0