console.time('SEND+MORE==MONEY')
console.log( solve('SEND+MORE==MONEY') )
console.timeEnd('SEND+MORE==MONEY')
console.time('third+third+third+seven==eight')
console.log( solve('third+third+third+seven==eight') )
console.timeEnd('third+third+third+seven==eight')
function solve ( Q ) {
const words = Q.match(/[\w]+/g), ops = Q.match(/[^\w]+/g)
const chars = [...new Set(words.join(''))], fchars = new Set(words.map(w=>w[0]))
let source = `(function(){\n`
for ( let c of chars ) {
source += `for (var ${c} = ${+fchars.has(c)}; ${c} <= 9; ${c}++) {\n`
for ( let c2 of [...chars].splice( 0, chars.indexOf(c) ) ) {
source += ` if (${c} == ${c2}) continue\n`
}
}
source += ` if ( (0 `
for ( let [i, w] of words.entries() ) {
for ( let [j, c] of [...w].reverse().entries() ) {
source += `+ ${c} * 10e${j}`
}
if ( i != words.length - 1 ) source += `) ${ops[i]} (0 `
}
source += `) ) return [${chars.join(',')}]\n`
source += `${'}\n'.repeat( chars.length )}})()\n`
const result = eval( source )
return result && Q.replace(/[\w]/g, c => result[chars.indexOf(c)])
}
Y29uc29sZS50aW1lKCdTRU5EK01PUkU9PU1PTkVZJykKY29uc29sZS5sb2coIHNvbHZlKCdTRU5EK01PUkU9PU1PTkVZJykgKQpjb25zb2xlLnRpbWVFbmQoJ1NFTkQrTU9SRT09TU9ORVknKQoKY29uc29sZS50aW1lKCd0aGlyZCt0aGlyZCt0aGlyZCtzZXZlbj09ZWlnaHQnKQpjb25zb2xlLmxvZyggc29sdmUoJ3RoaXJkK3RoaXJkK3RoaXJkK3NldmVuPT1laWdodCcpICkKY29uc29sZS50aW1lRW5kKCd0aGlyZCt0aGlyZCt0aGlyZCtzZXZlbj09ZWlnaHQnKQoKCgpmdW5jdGlvbiBzb2x2ZSAoIFEgKSB7Cgljb25zdCB3b3JkcyA9IFEubWF0Y2goL1tcd10rL2cpLCBvcHMgPSBRLm1hdGNoKC9bXlx3XSsvZykKCWNvbnN0IGNoYXJzID0gWy4uLm5ldyBTZXQod29yZHMuam9pbignJykpXSwgZmNoYXJzID0gbmV3IFNldCh3b3Jkcy5tYXAodz0+d1swXSkpCgoJbGV0IHNvdXJjZSA9IGAoZnVuY3Rpb24oKXtcbmAKCWZvciAoIGxldCBjIG9mIGNoYXJzICkgewoJCXNvdXJjZSArPSBgZm9yICh2YXIgJHtjfSA9ICR7K2ZjaGFycy5oYXMoYyl9OyAke2N9IDw9IDk7ICR7Y30rKykge1xuYAoJCWZvciAoIGxldCBjMiBvZiBbLi4uY2hhcnNdLnNwbGljZSggMCwgY2hhcnMuaW5kZXhPZihjKSApICkgewoJCQlzb3VyY2UgKz0gYCAgaWYgKCR7Y30gPT0gJHtjMn0pIGNvbnRpbnVlXG5gCgkJfQoJfQoKCXNvdXJjZSArPSBgICBpZiAoICgwIGAKCWZvciAoIGxldCBbaSwgd10gb2Ygd29yZHMuZW50cmllcygpICkgewoJCWZvciAoIGxldCBbaiwgY10gb2YgWy4uLnddLnJldmVyc2UoKS5lbnRyaWVzKCkgKSB7CgkJCXNvdXJjZSArPSBgKyAke2N9ICogMTBlJHtqfWAKCQl9CgkJaWYgKCBpICE9IHdvcmRzLmxlbmd0aCAtIDEgKSBzb3VyY2UgKz0gYCkgJHtvcHNbaV19ICgwIGAKCX0KCXNvdXJjZSArPSBgKSApIHJldHVybiBbJHtjaGFycy5qb2luKCcsJyl9XVxuYAoKCXNvdXJjZSArPSBgJHsnfVxuJy5yZXBlYXQoIGNoYXJzLmxlbmd0aCApfX0pKClcbmAKCWNvbnN0IHJlc3VsdCA9IGV2YWwoIHNvdXJjZSApCgoJcmV0dXJuIHJlc3VsdCAmJiBRLnJlcGxhY2UoL1tcd10vZywgYyA9PiByZXN1bHRbY2hhcnMuaW5kZXhPZihjKV0pCn0=