Permutations: Difference between revisions

Line 2,464:
 
=={{header|JavaScript}}==
===ES5===
====Iteration====
 
Copy the following as an HTML file and load in a browser.
Genuine js code, assuming no duplicate.
<lang javascript><html><head><title>Permutations</title></head>
<body><pre id="result"></pre>
<script type="text/javascript">
var d = document.getElementById('result');
 
function perm(list, ret)
{
if (list.length == 0) {
var row = document.createTextNode(ret.join(' ') + '\n');
d.appendChild(row);
return;
}
for (var i = 0; i < list.length; i++) {
var x = list.splice(i, 1);
ret.push(x);
perm(list, ret);
ret.pop();
list.splice(i, 0, x);
}
}
 
perm([1, 2, 'A', 4], []);
</script></body></html></lang>
 
Alternatively: 'Genuine' js code, assuming no duplicate.
 
<lang JavaScript>
Line 2,474 ⟶ 2,501:
var e = a.splice(c, 1),
f = perm(a);
for (d = 0; d < f.length; d++) b.push([e].concat(f[d]));
a.splice(c, 0, e)
} return b
Line 2,481 ⟶ 2,508:
console.log(perm(['Aardvarks', 'eat', 'ants']).join("\n"));
</lang>
 
 
{{Out}}
Line 2,490 ⟶ 2,516:
ants,Aardvarks,eat
ants,eat,Aardvarks</lang>
 
===Functional composition===
 
{{trans|Haskell}}
 
(Simple version – assuming a unique list of objects comparable by the JS === operator)
 
<lang JavaScript>(function () {
 
// [a] -> [[a]]
function permutations(xs) {
return xs.length ? (concatMap(
function (x) {
return concatMap(
function (ys) {
return ([[x].concat(ys)]);
}, permutations(delete1(x, xs)))
}, xs)) : [[]]
}
 
 
// GENERIC LIBRARY FUNCTIONS
 
// concatMap :: (a -> [b]) -> [a] -> [b]
function concatMap(f, xs) {
return [].concat.apply([], xs.map(f));
}
// delete first instance of 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]
function deleteBy(fnEq, x, xs) {
return xs.length ? fnEq(x, xs[0]) ? xs.slice(1) : [xs[0]]
.concat(deleteBy(fnEq, x, xs.slice(1))) : [];
}
 
 
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';
 
let 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>
 
 
{{Out}}
<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