Permutations: Difference between revisions

→‎{{header|JavaScript}}: ES5 and ES6 functional versions updated (latter moved to correct heading)
(→‎JS ES6: ( updated primitives ))
(→‎{{header|JavaScript}}: ES5 and ES6 functional versions updated (latter moved to correct heading))
Line 2,522:
 
(Simple version – assuming a unique list of objects comparable by the JS === operator)
 
<lang JavaScript>(function (lst) {
'use strict';
 
const// permutations =:: (xs)[a] =-> xs.length ? ([[a]]
 
returnvar permutations = function (lstxs); {
return xs.length ? concatMap(function (x) {
return concatMap(function (ys) {
flatMap((x) => flatMap((xs) => return [[x].concat(xsys)],;
}, permutations(deldelete_(x, xs))), xs);
}, xs) : [[]],;
};
 
// GENERIC FUNCTIONS
 
// concatMap :: (a -> [b]) -> [a] -> [b]
var concatMap = function (f, xs) {
flatMap = (f, xs) =>return [].concat.apply([], xs.map(f)),;
};
 
// delete :: Eq a => a -> [a] -> [a]
var delete_ = function (x, xs) {
return deleteBy(function (a, b) {
xs.slice(1)return a === b;
)}, :x, []xs);
};
 
// deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a]
var deleteBy = function (f, x, xs) {
)return : [xs[0]].concat(dellength > 0 ? f(x, xs[0]) ? xs.slice(1)) :
[xs[0]].concat(deleteBy(f, x, xs.slice(1))) : [];
};
 
// TEST
}) return permutations(["'Aardvarks"', "'eat"', "'ants"']);</lang>
})();</lang>
 
{{Out}}
<lang JavaScript>[["Aardvarks", "eat", "ants"], ["Aardvarks", "ants", "eat"],
["eat", "Aardvarks", "ants"], ["eat", "ants", "Aardvarks"],
["ants", "Aardvarks", "eat"], ["ants", "eat", "Aardvarks"]]</lang>
 
===ES6===
 
<lang JavaScript>(() => {
Line 2,534 ⟶ 2,578:
[]
];
 
 
// GENERIC FUNCTIONS
Line 2,556 ⟶ 2,599:
return permutations(['Aardvarks', 'eat', 'ants']);
 
})();</lang>
 
{{Out}}
<lang JavaScript>[["Aardvarks", "eat", "ants"], ["Aardvarks", "ants", "eat"],
["eat", "Aardvarks", "ants"], ["eat", "ants", "Aardvarks"],
["ants", "Aardvarks", "eat"], ["ants", "eat", "Aardvarks"]]</lang>
 
===ES6===
 
<lang JavaScript>(function (lst) {
'use strict';
 
const permutations = (xs) => xs.length ? (
flatMap((x) => flatMap((xs) => [[x].concat(xs)],
permutations(del(x, xs))), xs)
) : [[]],
 
flatMap = (f, xs) => [].concat.apply([], xs.map(f)),
 
del = (x, xs) => xs.length ? x === xs[0] ? (
xs.slice(1)
) : [xs[0]].concat(del(x, xs.slice(1))
) : [];
 
 
return permutations(lst);
 
})(["Aardvarks", "eat", "ants"]);</lang>
 
 
9,655

edits