ふくめん算アプリ
以下の例のように、計算式を入力してください。
同じアルファベットには同じ数字が対応しています。
例: SEND + MORE = MONEY
ご要望いただきありがとうございます。ふくめん算のアプリを作成いたしました。以下がソースコードになります。 ``` <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ふくめん算アプリ</title> </head> <body> <h1>ふくめん算アプリ</h1> <p>以下の例のように、計算式を入力してください。</p> <p>同じアルファベットには同じ数字が対応しています。</p> <p>例: SEND + MORE = MONEY</p> <form> <label for="inputEquation">計算式:</label> <input type="text" id="inputEquation"> <button type="button" onclick="solve()">解く</button> </form> <div id="result"></div> <script> function solve() { const inputEquation = document.getElementById("inputEquation").value.toUpperCase(); const equationArray = inputEquation.split("="); const leftSide = equationArray[0].replace(/ /g,""); const rightSide = equationArray[1].replace(/ /g,""); let digits = new Array(10).fill(false); let letters = new Array(26).fill(false); let usedLetters = new Array(26).fill(false); for (let i=0; i<leftSide.length; i++) { letters[leftSide.charCodeAt(i) - 65] = true; } for (let i=0; i<rightSide.length; i++) { letters[rightSide.charCodeAt(i) - 65] = true; } function dfs(index, total) { if (index === letters.length) { if (total === 0) { const leftVar = ""; const rightVar = ""; const numbers = new Array(26).fill(-1); for (let i=0; i<leftSide.length; i++) { if (numbers[leftSide.charCodeAt(i) - 65] === -1) { numbers[leftSide.charCodeAt(i) - 65] = digits[0]; digits[0] = false; } leftVar += numbers[leftSide.charCodeAt(i) - 65].toString(); } for (let i=0; i<rightSide.length; i++) { if (numbers[rightSide.charCodeAt(i) - 65] === -1) { numbers[rightSide.charCodeAt(i) - 65] = digits[0]; digits[0] = false; } rightVar += numbers[rightSide.charCodeAt(i) - 65].toString(); } if (parseInt(leftVar) + parseInt(rightVar) === parseInt(total)) { const resultDiv = document.getElementById("result"); resultDiv.innerText = inputEquation + "\n" + leftVar + " + " + rightVar + " = " + total; } } } else { if (letters[index]) { for (let i=0; i<digits.length; i++) { if (!usedLetters[index] && !digits[i]) { usedLetters[index] = true; digits[i] = true; dfs(index+1, total); digits[i] = false; usedLetters[index] = false; } } } else { dfs(index+1, total); } } } dfs(0, rightSide); } </script> </body> </html> ``` アルゴリズムとしては、まず、入力された計算式から左辺と右辺を分割し、どのアルファベットが出現するかを配列で保持します。その後、DFS探索で数字の割り当てを行い、それを元に該当する式が正しいかどうかをチェックします。 ご興味があれば、ぜひお試しください。