console.time('solve')
console.log( solve('SEND+MORE=MONEY') )
console.timeEnd('solve')
function solve ( Q ) {
const [A, X, B, , C] = Q.match(/[\w]+|./g)
const chars = [...new Set(A+B+C)], fchars = new Set(A[0]+B[0]+C[0])
let source = `(function(){\n`
for ( let c of chars ) {
source += `for(let ${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, c] of [...A].reverse().entries() ) {
source += `+ ${c} * 10e${i}`
}
source += `) ${X} (0 `
for ( let [i, c] of [...B].reverse().entries() ) {
source += `+ ${c} * 10e${i}`
}
source += `) == (0 `
for ( let [i, c] of [...C].reverse().entries() ) {
source += `+ ${c} * 10e${i}`
}
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)])
}
Y29uc29sZS50aW1lKCdzb2x2ZScpCmNvbnNvbGUubG9nKCBzb2x2ZSgnU0VORCtNT1JFPU1PTkVZJykgKQpjb25zb2xlLnRpbWVFbmQoJ3NvbHZlJykKCgoKZnVuY3Rpb24gc29sdmUgKCBRICkgewoJY29uc3QgW0EsIFgsIEIsICwgQ10gPSBRLm1hdGNoKC9bXHddK3wuL2cpCgljb25zdCBjaGFycyA9IFsuLi5uZXcgU2V0KEErQitDKV0sIGZjaGFycyA9IG5ldyBTZXQoQVswXStCWzBdK0NbMF0pCgoJbGV0IHNvdXJjZSA9IGAoZnVuY3Rpb24oKXtcbmAKCWZvciAoIGxldCBjIG9mIGNoYXJzICkgewoJCXNvdXJjZSArPSBgZm9yKGxldCAke2N9ID0gJHsrZmNoYXJzLmhhcyhjKX07ICR7Y30gPD0gOTsgJHtjfSsrKSB7XG5gCgkJZm9yICggbGV0IGMyIG9mIFsuLi5jaGFyc10uc3BsaWNlKCAwLCBjaGFycy5pbmRleE9mKGMpICkgKSB7CgkJCXNvdXJjZSArPSBgICBpZiAoJHtjfSA9PSAke2MyfSkgY29udGludWVcbmAKCQl9Cgl9CgoJc291cmNlICs9IGAgIGlmICggKDAgYAoJZm9yICggbGV0IFtpLCBjXSBvZiBbLi4uQV0ucmV2ZXJzZSgpLmVudHJpZXMoKSApIHsKCQlzb3VyY2UgKz0gYCsgJHtjfSAqIDEwZSR7aX1gCgl9Cglzb3VyY2UgKz0gYCkgJHtYfSAoMCBgCglmb3IgKCBsZXQgW2ksIGNdIG9mIFsuLi5CXS5yZXZlcnNlKCkuZW50cmllcygpICkgewoJCXNvdXJjZSArPSBgKyAke2N9ICogMTBlJHtpfWAKCX0KCXNvdXJjZSArPSBgKSA9PSAoMCBgCglmb3IgKCBsZXQgW2ksIGNdIG9mIFsuLi5DXS5yZXZlcnNlKCkuZW50cmllcygpICkgewoJCXNvdXJjZSArPSBgKyAke2N9ICogMTBlJHtpfWAKCX0KCXNvdXJjZSArPSBgKSApIHJldHVybiBbJHtjaGFycy5qb2luKCcsJyl9XVxuYAoKCXNvdXJjZSArPSBgJHsnfVxuJy5yZXBlYXQoIGNoYXJzLmxlbmd0aCApfX0pKClcbmAKCQoJY29uc3QgcmVzdWx0ID0gZXZhbCggc291cmNlICkKCglyZXR1cm4gcmVzdWx0ICYmIFEucmVwbGFjZSgvW1x3XS9nLCBjID0+IHJlc3VsdFtjaGFycy5pbmRleE9mKGMpXSkKCn0=