tkm-ymmt
6/5/2015 - 11:10 AM

makePatterns_model.js

#!/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)