Skip to content

Instantly share code, notes, and snippets.

@fredrikdev
Created May 7, 2019 17:45
Show Gist options
  • Save fredrikdev/8e717c32e335afb96c06ab33334aebc8 to your computer and use it in GitHub Desktop.
Save fredrikdev/8e717c32e335afb96c06ab33334aebc8 to your computer and use it in GitHub Desktop.
SEND+MORE=MONEY Solver
// SEND+MORE=MONEY Solver. By Fredrik Johansson 2019.
// Every distinct letter needs to be a number and the equation need to solve.
const o = document.getElementById('app');
o.innerHTML = `<h1>SEND+MORE=MONEY Solver</h1>`;
// input
let formula1 = "SEND";
// +
let formula2 = "MORE";
// =
let formula3 = "MONEY"; //"SEND+MORE=MONEY";
// initialize
let rotateUnique = ""; //"SENDMORY";
for (let x = 0; x < formula1.length; x++)
if (rotateUnique.indexOf(formula1[x]) < 0) rotateUnique += formula1[x];
for (let x = 0; x < formula2.length; x++)
if (rotateUnique.indexOf(formula2[x]) < 0) rotateUnique += formula2[x];
for (let x = 0; x < formula3.length; x++)
if (rotateUnique.indexOf(formula3[x]) < 0) rotateUnique += formula3[x];
let rotateUniqueRE = new Array();
for (let x = 0; x < rotateUnique.length; x++)
rotateUniqueRE.push(new RegExp(rotateUnique[x],"g"));
let rotateMin = "0".repeat(rotateUnique.length);
let rotateMax = "9".repeat(rotateUnique.length)*1;
// run
let tickStart = new Date();
for (let x = 0; x <= rotateMax; x++) {
let rotateData = (rotateMin + x).slice(-rotateMin.length);
// prepare
let f1 = formula1;
let f2 = formula2;
let f3 = formula3;
let h = new Array();
for (let y = 0; y < rotateUnique.length; y++) {
if (h.indexOf(rotateData[y]) > -1)
break;
h.push(rotateData[y]);
f1 = f1.replace(rotateUniqueRE[y], rotateData[y]);
f2 = f2.replace(rotateUniqueRE[y], rotateData[y]);
f3 = f3.replace(rotateUniqueRE[y], rotateData[y]);
if (y != rotateUnique.length - 1)
continue;
// eval
if (!f1.startsWith("0") && !f2.startsWith("0") && !f3.startsWith("0") && (f1*1 + f2*1 == f3*1)) {
o.innerHTML += "Answer is: " + f1 + "+" + f2 + "=" + f3 + "<br>";
o.innerHTML += "Ended after " + Math.round((new Date()-tickStart)/1000) + " sec!<br>";
return;
}
}
}
o.innerHTML += "No answer found!<br>";
o.innerHTML += "Ended after " + Math.round((new Date()-tickStart)/1000) + " sec!<br>";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment