Two arguments
- string length
- number of bits set
example input: 5, 2
output: ["00011", "00101", "00110", "01001", "01010", "01100", "10001", "10010", "10100", "11000"]
example input: 7, 3
output: ["0000111", "0001011", "0001101", "0001110", "0010011", "0010101", "0010110", "0011001", "0011010", "0011100", "0100011", "0100101", "0100110", "0101001", "0101010", "0101100", "0110001", "0110010", "0110100", "0111000", "1000011", "1000101", "1000110", "1001001", "1001010", "1001100", "1010001", "1010010", "1010100", "1011000", "1100001", "1100010", "1100100", "1101000", "1110000"]
Eager algorithm that I created becomes very inefficient starting from length more than 20
const getBinaries = (length, numberOfBitsSet) => {
const ones = new Array(length).fill(1).join('');
const max = parseInt(ones, 2) + 1;
const binaries = [];
for (let i = 1; i < max; i++) {
let bin = parseInt(i).toString(2);
const match = bin.match(/1/g);
if (!match || match.length !== numberOfBitsSet) {
continue;
}
const strLen = bin.split('').length;
const zeros = new Array(length - strLen).fill(0).join('');
bin = `${zeros}${bin}`;
binaries.push(bin);
}
return binaries;
};