連動ボタンの作り方
それにしても、オブジェクトを渡せるってスッキリ!
<!DOCTYPE html> <title></title> <style type="text/css"> #a input[type="button"] { width : 25px; } #b input[type="button"] { width : 60px; height : 60px; } </style> <form id="hoge" action="#"> <div id="a"> <input type="button" value="あ"> <input type="button" value="か"> <input type="button" value="さ"> <input type="button" value="た"> <input type="button" value="な"> <input type="button" value="は"> <input type="button" value="ま"> <input type="button" value="や"> <input type="button" value="ら"> <input type="button" value="わ"> <input type="button" value="ん"> </div> <div id="b"> <input type="button" value="・"> <input type="button" value="・"> <input type="button" value="・"> <input type="button" value="・"> <input type="button" value="・"> </div> <input type="hidden" name="Initials" value=""> </form> <script> var hoge = { a : document.querySelectorAll ('#a input'), b : document.querySelectorAll ('#b input'), c : { 'あ': ['あ', 'い', 'う', 'え', 'お'], 'か': ['か', 'き', 'く', 'け', 'こ'], 'さ': ['さ', 'し', 'す', 'せ', 'そ'], 'た': ['た', 'ち', 'つ', 'て', 'と'], 'な': ['な', 'に', 'ぬ', 'ね', 'の'], 'は': ['は', 'ひ', 'ふ', 'へ', 'ほ'], 'ま': ['ま', 'み', 'む', 'め', 'も'], 'や': ['や', '・', 'ゆ', '・', 'よ'], 'ら': ['ら', 'り', 'る', 'れ', 'ろ'], 'わ': ['わ', 'ゐ', '・', 'ゑ', 'を'], 'ん': ['ん', '・', '・', '・', '・'] }, d : function (a, b) { this[b].value = a; this[b].disabled = (a == '・')}, e : document.querySelector ('input[name="Initials"]'), handleEvent : function (evt) { var e = evt.target; if ('INPUT' === e.nodeName) if ('button' === e.type) switch (e.parentNode.id) { case 'a' : this.c[e.value].forEach (this.d, this.b); break; case 'b' : if ('・' !== e.value) { this.e.value = e.value; e.form.submit (); } break; } } }; document.addEventListener ('click', hoge, false); </script>
[1,4,5,6]と4則演算で答えが24になる式を返すプログラム、その2
深夜、頭が激痛に見舞われ眠れない。この激痛とすでに3時間戦っている。
そして浮かんだ!
A*B == B*A だけど、A/B != B/A
割り算は、違うのね〜!
そして出来た!
括弧の処理は、この激痛の中で、思考するのは無理っぽ。
もちろん、gtlt さん ご指摘の誤差は、最初から考慮済みさぁ!
<!DOCTYPE html> <title></title> <body> <script type="application/javascript; version=1.8"> const permutation = (function (map) (function (r, m, i, o) (o.length < 2) ? o : r.concat (o.slice (0, i) .concat (o.slice (i + 1)) .reduce (arguments.callee, []) .map (map, [m])))) (function (q) this.concat (q)); const rcombination = (function (memo, count) (function (r, m, _, a) (count > 1) ? a.reduce (rcombination (memo.concat (m), count - 1), r) : r.concat ([ memo.concat (m) ]))); const addNegative = (function (r, a) let (c = a.slice (0)) r.concat ([a, (c[0]=-c[0], c)])); function question (numbers, result) { var err = 0.000001; var len = numbers.length; var nums = numbers.reduce (permutation, []).reduce (addNegative,[]); // 数値の組み合わせ var optn = ['+', '-', '*', '*-', '/', '/-', '\\', '\\-'].reduce (rcombination ([], len - 1), []); // 演算 var r, n, s; for (var i = 0, I = nums.length; i < I; i++) { for (var j = 0, J = optn.length; j < J; j++) { r = nums[i][0]; s = r + ''; for (var k = 0, K = len - 1; k < K; k++) { n = nums[i][k+1]; s += optn[j][k] + n; switch (optn[j][k]) { case '+' : r += n; break; case '-' : r -= n; break; case '*' : r *= n; break; case '*-' : r *= -n; break; case '/' : r /= n; break; case '/-' : r /= -n; break; case '\\' : r = n / r; break; case '\\-' : r = -n / r; break; } } if (Math.abs (result - r) < err) yield s + ' = ' + r; } } } document.write ([ n for (n in question ([1,4,5,6], 24)) ].join ('<br>')); </script>
結果は、
4\5-1\6 = 24 4\-5+1\-6 = 24 -4\5+1\-6 = 24 -4\-5-1\6 = 24 5/4-1\6 = 24 5/-4+1\-6 = 24 -5/4+1\-6 = 24 -5/-4-1\6 = 24 5/6-1\-4 = 24.000000000000007 5/-6+1\4 = 24.000000000000007 -5/6+1\4 = 24.000000000000007 -5/-6-1\-4 = 24.000000000000007 6\5-1\-4 = 24.000000000000007 6\-5+1\4 = 24.000000000000007 -6\5+1\4 = 24.000000000000007 -6\-5-1\-4 = 24.000000000000007
注意:
式は強制的に左から右へ計算している。 \ は、割り算でも除数と被除数を交換して行うことを意味する
この調子で逝くと、平方根とか、べき乗算も簡単に加えさせることができそうだが、調子こいてこれ以上応用問題を増やしたりすると、脳みそが飛び散るぜぇ!
「脳みそ、ば・ば〜ん!」