連動ボタンの作り方

それにしても、オブジェクトを渡せるってスッキリ!

<!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

注意:
式は強制的に左から右へ計算している。 \ は、割り算でも除数と被除数を交換して行うことを意味する


この調子で逝くと、平方根とか、べき乗算も簡単に加えさせることができそうだが、調子こいてこれ以上応用問題を増やしたりすると、脳みそが飛び散るぜぇ!
「脳みそ、ば・ば〜ん!」