Last active
October 12, 2018 06:20
-
-
Save ChugunovRoman/d33d51c37c04ad36c7b2e19b1d7ebe6c to your computer and use it in GitHub Desktop.
All possible combinations of elements in array
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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