パスカルの三角形 ― 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: http://nanto.asablo.jp/blog/2006/06/07/395748/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。