Равномерно распределять логические значения по массиву (Javascript) - PullRequest
2 голосов
/ 04 августа 2020

У меня есть логический массив фиксированной длины. По умолчанию установлены значения false. Мне нужно заполнить массив N значениями true, которые в основном равномерно распределены и распределены по массиву.

Например: если длина равна 7, а N равно 3, это будет выглядеть примерно так: [false, true, false, true, false, true, false]

Если длина равна 14, а N равно 5, это будет выглядеть примерно так: [false, false, true, false, false, true, false, false, true, false, true, false, true, false]

Дело в том, что нет строгого правила, как его распространять, только то, что он должен распространяться в основном ровным слоем (возможно, с правилом, что элементы first и last не будут истинными, но это не обязательно).

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

function createBoolArray(len, trues) {
  const arr = new Array(len).fill(false);
  
  let leftTrues = trues;
  let left = len;
  let divisor = 0;
  for(let i = 0; i < len && leftTrues > 0;) {
    left = len - i;
    divisor = Math.floor(left / leftTrues);
    
    if(Math.floor(left / divisor) > leftTrues) {
      i = i + divisor + 1;
      arr[i - 1] = true;
    } else {
      i = i + divisor;
      arr[i - 1] = true;
    }
    leftTrues--;
  }
  
  return arr;
}

console.log(createBoolArray(14, 5))
0 голосов
/ 05 августа 2020

Закончил этим (аналогично тому, что предложил @ChrisG):

function createBoolArray(len, trues) {
  const arr = new Array(len).fill(false);
  new Array(trues).fill(0).map((_, i) => 
  Math.floor((i+1) * (len-1) / trues))
 .forEach(e => arr[e] = true);

  return arr;
}

console.log(createBoolArray(14, 5))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...