Perfect numbers: Difference between revisions

Content added Content deleted
Line 981: Line 981:
<lang JavaScript>(function (nFrom, nTo) {
<lang JavaScript>(function (nFrom, nTo) {


// MONADIC CHAIN (bind) IN LIEU OF FILTER
// MONADIC CHAIN (bind) IN LIEU OF FILTER
// ( monadic return for lists is just lambda x -> [x] )
// ( monadic return for lists is just lambda x -> [x] )


return chain(
return chain(
rng(nFrom, nTo),
rng(nFrom, nTo),


function (x) {
function (x) {
return (
return (
function perfect(n) {
function perfect(n) {
return chain(
return chain(
rng(1, Math.floor(Math.sqrt(n))),
rng(1, Math.floor(Math.sqrt(n))),
function (y) {
return (n % y) === 0 && n > 1 ? [y, n / y] : [];
function (y) {
}
return (n % y) === 0 && n > 1 ? [y, n / y] : [];
).reduce(function (a, x) {
}
return a + x;
).reduce(function (a, x) {
}, 0) / 2 === n;
return a + x;
}
}, 0) / 2 === n;
)(x) ? [x] : [];
}
}
);
)(x) ? [x] : [];
}
);


/******************************************************************/
/******************************************************************/


// Monadic bind (chain) for lists
// Monadic bind (chain) for lists
function chain(xs, f) {
function chain(xs, f) {
return [].concat.apply([], xs.map(f));
return [].concat.apply([], xs.map(f));
}
}


function rng(m, n) {
function rng(m, n) {
return Array.apply(null, Array(n - m + 1)).map(function (x, i) {
return Array.apply(null, Array(n - m + 1)).map(function (x, i) {
return m + i;
return m + i;
});
});
}
}


})(1, 10000);</lang>
})(1, 10000);</lang>