Skip to content

Instantly share code, notes, and snippets.

@crosshj
Last active April 25, 2016 01:14
Show Gist options
  • Select an option

  • Save crosshj/365a8dcfc99ad11491cc2a14380aa7c9 to your computer and use it in GitHub Desktop.

Select an option

Save crosshj/365a8dcfc99ad11491cc2a14380aa7c9 to your computer and use it in GitHub Desktop.
Pascal's Triangle
/*
Pascal's Triangle
usage:
triangle(<number of levels to display>)
returns:
one string for each level of pyramid followed by a newline
*/
// eg. sequence(4) returns [0,1,2,3,4]
var sequence = (function() {
var cache = {};
function seq(end) {
if (cache[end] !== undefined) {
return cache[end];
}
var result = [];
for (var i = 0; i <= end; i++) {
result.push(i);
cache[i] = Object.assign([], result);
}
return result;
}
return seq;
})();
// eg. factorial(4) returns result of 1*2*3*4
var factorial = (function() {
var cache = {};
function fac(number) {
if (cache[number] !== undefined) {
return cache[number];
}
var result = sequence(number)
.filter(function(item) {
return item > 1;
})
.reduce(function(prev, next) {
return prev * next;
}, 1);
cache[number] = result;
return result;
}
return fac;
})();
function nChooseK(n, k) {
var num = factorial(n);
var denom = factorial(k) * factorial(n - k);
return num / denom;
}
function row(number) {
var result = sequence(number)
.map(function(item) {
return nChooseK(number, item);
}, '')
.join(' ');
return result;
}
function triangle(height) {
var result = sequence(height)
.reduce(function(prev, next) {
return prev + row(next) + '\n'
}, '');
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment