разбить массив на куски по n с разным наполнением
функция на вход которой приходит массив и длинна куска n. на выходе массивы длинной n с разными вариантами наполнения.
пример:
const func (arr, chunk) => {
//code
return result
}
func([51, 56, 58, 59, 61], 3) // [51,56,58], [51,56,59], [51,56,61], [51,58,59], [51, 58,61], [51,59,61], [56,58,59], [56,58,61], [56,59,61], [58,59,61]
Ответы (1 шт):
Автор решения: Alexander Lonberg
→ Ссылка
Эту задачу легко решить с помощью двоичных чисел.
Начинается отчет(в обратном порядке) от
[11100]
Кончается на
[00111]
... думаю идея понятна. Увеличиваем десятичное число и делаем выборку в позиции нужного бита.
const toBin = (v) => v.toString(2)
const toInt = (v) => Number.parseInt(v, 2)
const fun = (array, chunk) => {
const result = []
const push = (ind) => result.push(
ind.split('').reduce((a, v, i) => {
v === '1' && a.push(array[i])
return a
}, [])
)
let s = toInt(''.padStart(chunk, '1').padEnd(array.length, '0'))
const e = toInt(''.padEnd(chunk, '1').padStart(array.length, '0'))
do {
s = toBin(s).padStart(array.length, '0')
if (s.replace(/0/g, '').length === chunk) push(s)
} while ((s = toInt(s) - 1) >= e)
return result
}
console.log(
fun([51, 56, 58, 59, 61], 3)
)