Published
Edited
Dec 19, 2020
Insert cell
Insert cell
isDigit = char => 48 <= char.charCodeAt(0) && char.charCodeAt(0) <= 57
Insert cell
["0".charCodeAt(0), "9".charCodeAt(0)]
Insert cell
apply = (a, b, op) => {
switch (op) {
case '+':
return a + b;
case '*':
return a * b;
}
}
Insert cell
function solve(expr, charPtr = 0) {
// async function* solve(expr, charPtr = 0) {
let value = 0,
op = '+';
while (charPtr < expr.length && expr[charPtr] !== ')') {
const char = expr[charPtr];
// await Promises.delay(500);
// yield [value, op, char];

if (isDigit(char)) {
value = apply(value, parseInt(char), op);
} else if (char === '+' || char === '*') {
op = char;
} else if (char === '(') {
const [parenValue, endOfParenPtr] = solve(expr, charPtr + 1);
value = apply(value, parenValue, op);
charPtr = endOfParenPtr;
}
charPtr++;
}
return [value, charPtr];
}
Insert cell
solve('1 + 2 * 3 + 4 * 5 + 6')
Insert cell
solve('5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))')
Insert cell
solve('((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2')[0]
Insert cell
Insert cell
Insert cell
input
.split('\n')
.map(l => solve(l)[0])
.reduce((a, b) => a + b)
Insert cell
Insert cell
function solve2(expr, charPtr = 0) {
// async function* solve2(expr, charPtr = 0) {
let value = 0,
op = '+';
const factors = [];
while (charPtr < expr.length && expr[charPtr] !== ')') {
const char = expr[charPtr];
// await Promises.delay(500);
// yield [value, op, char, factors];

if (isDigit(char)) {
if (op === '*') {
factors.push(value);
value = parseInt(char);
op = '+';
} else if (op === '+') {
value += parseInt(char);
}
} else if (char === '+' || char === '*') {
op = char;
} else if (char === '(') {
const [parenValue, endOfParenPtr] = solve2(expr, charPtr + 1);
if (op === '*') {
factors.push(parenValue);
} else if (op === '+') {
value += parenValue;
}
charPtr = endOfParenPtr;
}
charPtr++;
}
if (factors.length) {
value = factors.reduce((acc, num) => acc * num, value);
}
return [value, charPtr];
}
Insert cell
solve2('1 + 2 * 3 + 4 * 5 + 6')[0]
Insert cell
solve2('1 + (2 * 3) + (4 * (5 + 6))')[0]
Insert cell
solve2('4 * (5 + 6)')[0]
Insert cell
solve2('2 * 3 + (4 * 5)')[0]
Insert cell
solve2('5 + (8 * 3 + 9 + 3 * 4 * 3)')[0]
Insert cell
solve2('5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))')[0]
Insert cell
solve2('((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2')[0]
Insert cell
((2 + 4) * 9 * ((6 + 9) * (8 + 6) + 6) + 2 + 4) * 2
Insert cell
solve2(input)[0]
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more