JSFiddle - React, Tailwind, and code Playground

by mayorovp

JavaScript

find(...parse("VOLVO + FIAT == MOTOR"));

function parse(expr) {
    var letters = [...new Set(expr.match(/\w/g))];
    var words = [...new Set(expr.match(/\w+/g))];
    
    var defs = words.map(w => `\tconst ${w} = ` + 
    	[...w].map((l, i) => `${l} * ${Math.pow(10, w.length - i - 1)}`).join(" + ")
    ).join("\n");
    var q1 = `function ([${letters.join(", ")}]) {
${defs}
	return ${expr};
}`;
		var quotedExpr = "`" + expr.replace(/\w+/g, w => "${" + w + "}") + "`";
		var q2 = `function ([${letters.join(", ")}]) {
${defs}
	return ${quotedExpr};
}`;
		return new Function (`return [${q1}, ${q2}]`)();
}

function find(pred, fn) {
  const digits = [0,1,2,3,4,5,6,7,8,9];
  do {
    if (pred(digits))
    	console.log(fn(digits));

    let i;
    for (i = 1; i < digits.length; i++)
      if (digits[i-1] < digits[i])
        break;

    if (i == digits.length) break;

    let j;
    for (let k = 0; k<i; k++)
      if (digits[k] < digits[i]) {
        j = k;
        break;
      }

    [digits[j], digits[i]] = [digits[i], digits[j]];
    i--;
    for (j = 0; j<i; j++, i--) {
      [digits[i], digits[j]] = [digits[j], digits[i]];
    }
  } while (true);
}