Permutations: Difference between revisions

→‎Functional (ES5): (slightly closer translation of Haskell Prelude functions)
(→‎Functional (ES5): (slightly closer translation of Haskell Prelude functions))
Line 2,105:
<lang JavaScript>(function () {
 
// [a] -> [[a]]
function permutations(xs) {
return xs.length ? (chainconcatMap(xs, function (x) {
return chain(permutations(deleted(x, xs)), function (ysx) {
return concatMap([[x].concat(ys)]);
function (ys) {
})
return ([[x].concat(ys)]);
})) : [[]]
}, permutations(delete1(x, xs)))
}
}, xs)) : [[]]
})
 
// concatMap :: (a -> [b]) -> [a] -> [b]
// monadic bind/chain for lists
function chainconcatMap(xsf, fxs) {
return [].concat.apply([], xs.map(f));
}
// dropsdelete first instance foundof a in [a]
// delete1 :: a -> [a] -> [a]
function delete1(x, xs) {
return deleteBy(function (a, b) {
return a === b;
}, x, xs);
}
 
// deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a]
// drops first instance found
function deleteddeleteBy(fnEq, x, xs) {
return xs.length ? fnEq(x ===, xs[0]) ? xs.slice(1) : [xs[0]]
.concat(deleteddeleteBy(fnEq, x, xs.slice(1))) : [];
}
 
 
return permutations(['Aardvarks', 'eat', 'ants'])
 
})();</lang>
Line 2,132 ⟶ 2,143:
 
<lang JavaScript>[["Aardvarks", "eat", "ants"], ["Aardvarks", "ants", "eat"],
["eat", "Aardvarks", "ants"], ["eat", "ants", "Aardvarks"],
["ants", "Aardvarks", "eat"], ["ants", "eat", "Aardvarks"]]</lang>
 
=={{header|jq}}==
9,659

edits