-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathdifferent-ways-to-add-parentheses.js
71 lines (61 loc) · 1.41 KB
/
different-ways-to-add-parentheses.js
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
var DEBUG = process.env.DEBUG;
var ops = {
'+': function (a, b) { return a + b;},
'-': function (a, b) { return a - b;},
'*': function (a, b) { return a * b;}
};
/**
* @param {string} input
* @return {number[]}
*/
var diffWaysToCompute = function(input) {
var m = aExpr(input);
return m.sort(function (a, b) {return a - b;});
};
function aExpr(input) {
var ans = [];
for (var i = 0; i < input.length; i++) {
if (input[i] in ops) {
var a1 = aExpr(input.slice(0, i));
var a2 = aExpr(input.slice(i+1));
for (var v1 in a1)
for (var v2 in a2)
ans.push(ops[input[i]](a1[v1], a2[v2]));
}
}
if (ans.length === 0)
ans.push(sExpr(input).value());
return ans;
}
function sExpr(str) {
var i = 0;
while (i < str.length && ! (str[i] in ops)) i++;
if (i === str.length) {
return new Expr(str);
} else {
return new Expr(str[i], sExpr(str.slice(0, i)), sExpr(str.slice(i+1)));
}
}
function Expr(op, expr1, expr2) {
this.op = op;
this.expr1 = expr1;
this.expr2 = expr2;
}
Expr.prototype.value = function () {
if (isNaN(Number(this.op))) {
var v1 = this.expr1.value();
var v2 = this.expr2.value();
return ops[this.op](v1, v2);
} else {
return Number(this.op);
}
};
function test(f) {
[
["2*3-4*5"],
["2-1-1"]
].forEach(function (input) {
console.log(f.apply(undefined, input));
});
}
if (DEBUG) test(diffWaysToCompute);