1,4,5,6 と四則演算を使い、答えが24になるものを探すプログラムを書く!

解法を考える。
式を文字列にして eval 関数に渡して配列になるように考えた。
しかし、括弧の位置を変えるのが面倒になった。
そこで、括弧を無視して左から右へ強制的に計算するようにしてみる。
しかしだ!
答えが無くない?


まだまだ思案中です。

<!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.0001;
  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;
        }
      }
      if (Math.abs (result - r) < err)
        yield s + ' = ' + r;
    }
  }
}

alert ([ n for (n in question ([1,4,5,6], 24)) ].join ('\n'));

</script>