разбить массив на куски по 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)
)

→ Ссылка