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>