Skip to content

Instantly share code, notes, and snippets.

@ChugunovRoman
Last active October 12, 2018 06:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChugunovRoman/d33d51c37c04ad36c7b2e19b1d7ebe6c to your computer and use it in GitHub Desktop.
Save ChugunovRoman/d33d51c37c04ad36c7b2e19b1d7ebe6c to your computer and use it in GitHub Desktop.
All possible combinations of elements in array
#! /usr/bin/node
const Readable = require('stream').Readable;
const stream = new Readable;
stream.on('data', chunk => {
console.log(JSON.parse(chunk.toString()));
});
const make = (arr, el) => {
let i = arr.length;
let res = [];
while (i >= 0) {
res.push([
...arr.slice(0, i),
el,
...arr.slice(i)
]);
i--;
}
return res;
}
const combinations = arr => {
let
prev = [],
curr = [],
result = [],
len = arr.length;
for (let i = 0; i < len; i++) {
result.push([arr[i]]);
}
prev = result;
for (let i = 0; i < len; i++) {
prev = [result[i]];
rest = [
...arr.slice(0, i),
...arr.slice(i + 1, result.length)
]
stream.push(JSON.stringify(prev));
for (let j = 0; j < rest.length; j++) {
prev.forEach(item => {
curr.push(...make(item, rest[j]));
});
stream.push(JSON.stringify(curr));
prev = curr;
curr = [];
}
}
stream.push(null);
}
let c = combinations(['a', 'b', 'c', 'd']);
// For big arrays it is do not work.
// FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
// Output:
// [ [ 'a' ] ]
// [ [ 'a', 'b' ], [ 'b', 'a' ] ]
// [ [ 'a', 'b', 'c' ],
// [ 'a', 'c', 'b' ],
// [ 'c', 'a', 'b' ],
// [ 'b', 'a', 'c' ],
// [ 'b', 'c', 'a' ],
// [ 'c', 'b', 'a' ] ]
// [ [ 'a', 'b', 'c', 'd' ],
// [ 'a', 'b', 'd', 'c' ],
// [ 'a', 'd', 'b', 'c' ],
// [ 'd', 'a', 'b', 'c' ],
// [ 'a', 'c', 'b', 'd' ],
// [ 'a', 'c', 'd', 'b' ],
// [ 'a', 'd', 'c', 'b' ],
// [ 'd', 'a', 'c', 'b' ],
// [ 'c', 'a', 'b', 'd' ],
// [ 'c', 'a', 'd', 'b' ],
// [ 'c', 'd', 'a', 'b' ],
// [ 'd', 'c', 'a', 'b' ],
// [ 'b', 'a', 'c', 'd' ],
// [ 'b', 'a', 'd', 'c' ],
// [ 'b', 'd', 'a', 'c' ],
// [ 'd', 'b', 'a', 'c' ],
// [ 'b', 'c', 'a', 'd' ],
// [ 'b', 'c', 'd', 'a' ],
// [ 'b', 'd', 'c', 'a' ],
// [ 'd', 'b', 'c', 'a' ],
// [ 'c', 'b', 'a', 'd' ],
// [ 'c', 'b', 'd', 'a' ],
// [ 'c', 'd', 'b', 'a' ],
// [ 'd', 'c', 'b', 'a' ] ]
// [ [ 'b' ] ]
// [ [ 'b', 'a' ], [ 'a', 'b' ] ]
// [ [ 'b', 'a', 'c' ],
// [ 'b', 'c', 'a' ],
// [ 'c', 'b', 'a' ],
// [ 'a', 'b', 'c' ],
// [ 'a', 'c', 'b' ],
// [ 'c', 'a', 'b' ] ]
// [ [ 'b', 'a', 'c', 'd' ],
// [ 'b', 'a', 'd', 'c' ],
// [ 'b', 'd', 'a', 'c' ],
// [ 'd', 'b', 'a', 'c' ],
// [ 'b', 'c', 'a', 'd' ],
// [ 'b', 'c', 'd', 'a' ],
// [ 'b', 'd', 'c', 'a' ],
// [ 'd', 'b', 'c', 'a' ],
// [ 'c', 'b', 'a', 'd' ],
// [ 'c', 'b', 'd', 'a' ],
// [ 'c', 'd', 'b', 'a' ],
// [ 'd', 'c', 'b', 'a' ],
// [ 'a', 'b', 'c', 'd' ],
// [ 'a', 'b', 'd', 'c' ],
// [ 'a', 'd', 'b', 'c' ],
// [ 'd', 'a', 'b', 'c' ],
// [ 'a', 'c', 'b', 'd' ],
// [ 'a', 'c', 'd', 'b' ],
// [ 'a', 'd', 'c', 'b' ],
// [ 'd', 'a', 'c', 'b' ],
// [ 'c', 'a', 'b', 'd' ],
// [ 'c', 'a', 'd', 'b' ],
// [ 'c', 'd', 'a', 'b' ],
// [ 'd', 'c', 'a', 'b' ] ]
// [ [ 'c' ] ]
// [ [ 'c', 'a' ], [ 'a', 'c' ] ]
// [ [ 'c', 'a', 'b' ],
// [ 'c', 'b', 'a' ],
// [ 'b', 'c', 'a' ],
// [ 'a', 'c', 'b' ],
// [ 'a', 'b', 'c' ],
// [ 'b', 'a', 'c' ] ]
// [ [ 'c', 'a', 'b', 'd' ],
// [ 'c', 'a', 'd', 'b' ],
// [ 'c', 'd', 'a', 'b' ],
// [ 'd', 'c', 'a', 'b' ],
// [ 'c', 'b', 'a', 'd' ],
// [ 'c', 'b', 'd', 'a' ],
// [ 'c', 'd', 'b', 'a' ],
// [ 'd', 'c', 'b', 'a' ],
// [ 'b', 'c', 'a', 'd' ],
// [ 'b', 'c', 'd', 'a' ],
// [ 'b', 'd', 'c', 'a' ],
// [ 'd', 'b', 'c', 'a' ],
// [ 'a', 'c', 'b', 'd' ],
// [ 'a', 'c', 'd', 'b' ],
// [ 'a', 'd', 'c', 'b' ],
// [ 'd', 'a', 'c', 'b' ],
// [ 'a', 'b', 'c', 'd' ],
// [ 'a', 'b', 'd', 'c' ],
// [ 'a', 'd', 'b', 'c' ],
// [ 'd', 'a', 'b', 'c' ],
// [ 'b', 'a', 'c', 'd' ],
// [ 'b', 'a', 'd', 'c' ],
// [ 'b', 'd', 'a', 'c' ],
// [ 'd', 'b', 'a', 'c' ] ]
// [ [ 'd' ] ]
// [ [ 'd', 'a' ], [ 'a', 'd' ] ]
// [ [ 'd', 'a', 'b' ],
// [ 'd', 'b', 'a' ],
// [ 'b', 'd', 'a' ],
// [ 'a', 'd', 'b' ],
// [ 'a', 'b', 'd' ],
// [ 'b', 'a', 'd' ] ]
// [ [ 'd', 'a', 'b', 'c' ],
// [ 'd', 'a', 'c', 'b' ],
// [ 'd', 'c', 'a', 'b' ],
// [ 'c', 'd', 'a', 'b' ],
// [ 'd', 'b', 'a', 'c' ],
// [ 'd', 'b', 'c', 'a' ],
// [ 'd', 'c', 'b', 'a' ],
// [ 'c', 'd', 'b', 'a' ],
// [ 'b', 'd', 'a', 'c' ],
// [ 'b', 'd', 'c', 'a' ],
// [ 'b', 'c', 'd', 'a' ],
// [ 'c', 'b', 'd', 'a' ],
// [ 'a', 'd', 'b', 'c' ],
// [ 'a', 'd', 'c', 'b' ],
// [ 'a', 'c', 'd', 'b' ],
// [ 'c', 'a', 'd', 'b' ],
// [ 'a', 'b', 'd', 'c' ],
// [ 'a', 'b', 'c', 'd' ],
// [ 'a', 'c', 'b', 'd' ],
// [ 'c', 'a', 'b', 'd' ],
// [ 'b', 'a', 'd', 'c' ],
// [ 'b', 'a', 'c', 'd' ],
// [ 'b', 'c', 'a', 'd' ],
// [ 'c', 'b', 'a', 'd' ] ]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment