パスカルの三角形2006年06月07日 06時50分

「パスカルの三角形」(d.y.d.) より。とりあえず JavaScript で書いてみる。

function pascal(n) {
  var result = [1];
  n.times(function () {
    result.inject(function (prev, current, index) {
      result[index] = prev + current;
      return current;
    });
    result.push(1);
  });
  return result;
}

10 .times(function (n) {
  print(pascal(n));
});

/*
1
1,1
1,2,1
1,3,3,1
1,4,6,4,1
1,5,10,10,5,1
1,6,15,20,15,6,1
1,7,21,35,35,21,7,1
1,8,28,56,70,56,28,8,1
1,9,36,84,126,126,84,36,9,1
*/

ヘルパ関数は以下のとおり。

Number.prototype.times = function (callback, thisObject) {
  for (var i = 0; i < this; i++)
    callback.call(thisObject, i);
  return this;
};

/* array.inject(callback);
 * array.inject(initial, callback [, thisObject [, omitInitial]]);
 */
Array.prototype.inject = function (initial, callback, thisObject, omitInitial) {
  var length = this.length;
  var result = initial;
  var i = 0;
  if (arguments.length == 1) {
    callback = arguments[0];
    omitInitial = true;
  }
  if (omitInitial)
    result = this[i++];
  for (; i < length; i++)
    result = callback.call(thisObject, result, this[i], i, this);
  return result;
};

prototype.js の Enumerable#inject は初期値を省略することができないが、ここでは Ruby に従って初期値を省略できるようにした。MochiKit の reduce は初期値を省略できる。

これを書いて inject って便利だな、でも代入を使っているあたり何か間違ってるような気が……と思っていたら「Game Scripting Memo - 続・パスカルの三角形」を見て目から鱗。なるほど、inject とはこういう風に使うものだったのか……。どうもこの境地には達し得なさそうな気がするのでせめてメモとして JavaScript に書き直してみる (動作未確認、要 prototype.js)。

print($R(1, 10).map(function (i) {
  return $R(1, i, true).inject([1], function (list) {
    return list.concat(0).inject([0, []], function (data, current) {
      return [current, data[1].concat(data[0] + current)];
    })[1];
  });
}).join("\n"));

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
「ハイパーテキストマークアップ言語」をアルファベット4文字でいうと?

コメント:

トラックバック

このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2006/06/07/395748/tb