41 lines
1.1 KiB
JavaScript
41 lines
1.1 KiB
JavaScript
(function (strList) {
|
|
|
|
// [a] -> [[a]]
|
|
function permutations(xs) {
|
|
return xs.length ? (
|
|
chain(xs, function (x) {
|
|
return chain(permutations(deleted(x, xs)), function (ys) {
|
|
return [[x].concat(ys).join('')];
|
|
})
|
|
})) : [[]];
|
|
}
|
|
|
|
// Monadic bind/chain for lists
|
|
// [a] -> (a -> b) -> [b]
|
|
function chain(xs, f) {
|
|
return [].concat.apply([], xs.map(f));
|
|
}
|
|
|
|
// a -> [a] -> [a]
|
|
function deleted(x, xs) {
|
|
return xs.length ? (
|
|
x === xs[0] ? xs.slice(1) : [xs[0]].concat(
|
|
deleted(x, xs.slice(1))
|
|
)
|
|
) : [];
|
|
}
|
|
|
|
// Provided subset
|
|
var lstSubSet = strList.split('\n');
|
|
|
|
// Any missing permutations
|
|
// (we can use fold/reduce, filter, or chain (concat map) here)
|
|
return chain(permutations('ABCD'.split('')), function (x) {
|
|
return lstSubSet.indexOf(x) === -1 ? [x] : [];
|
|
});
|
|
|
|
})(
|
|
'ABCD\nCABD\nACDB\nDACB\nBCDA\nACBD\nADCB\nCDAB\nDABC\nBCAD\nCADB\n\
|
|
CDBA\nCBAD\nABDC\nADBC\nBDCA\nDCBA\nBACD\nBADC\nBDAC\nCBDA\nDBCA\nDCAB'
|
|
);
|