#!/usr/bin/env node
// code from http://repon.hatenablog.com/entry/2015/05/31/145728
var calc = function(n) {
// n=9の時、対象は1~9
// ac は 3の8乗
var ac = Math.pow(3, n - 1), m = ["", ",+,", ",-,"], res = [];
console.log(ac);
for (var i = 0; i < (ac - 1); i++) {
// 3進法で表す理由
// 各桁の次に入る記号/空白をパターンとして捉える。
//
// 空白,+,-の3つのパターンがn-1つのスペースに入るので(1..9の間)
// Math.pow(3, n-1)で全組み合わせの全要素数を最初に算出し、
// 各桁の間に入る空白,+,-を0,1,2で表現するため、その数字を3進数にする。
//
// できた3進数の配列の要素が全てn-1桁になるよう整形し、
// 必ず3パターンのどれかが該当するようにする。
//
// 要素の総組み合わせ合計分のacの数だけ
// 8桁の空白, +, - のパターンが出来上がるので、
// その桁数分だけの1..8の数字の次の文字をパターンで埋めて、
// 要素の総組み合わせを作成する。
var p = Number(i).toString(3);//3進法で表す
// 桁を整形
p = Array(n - 1 - p.length + 1).join("0") + p;
var str = "";
for (var j = 0; j < p.length; j++) {
str += (j + 1).toString() + m[p[j].toString()];
}
str += n.toString();
var ary = str.split(",");
var tmp = Number(ary[0]);
// 各項目を計算させている。
// ここは多分配列を云々するより、evalのが早そう。
for (j = 1; j < (ary.length - 1); j++) {
if (ary[j] === "+") {
tmp += Number(ary[j + 1]);
} else if (ary[j] === "-") {
tmp -= Number(ary[j + 1]);
}
}
if (tmp === 100) {
res.push(ary.join(""));
}
}
//console.log("result", res);
};
calc(9)