Показать сообщение отдельно
  #8 (permalink)  
Старый 12.06.2018, 02:28
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Сообщение от рони Посмотреть сообщение
j0hnik,
что-то типа
output[i] = Math.floor(total/input.length)
Так и делай, только floor лучше заменить на ceil.

var input = [5,10,0,12], //массив лимита каждой ячейки
    total = 7, // сумма которую надо распределить равномерно
    output = [];// результат распределения
//total = 7 => output = [2,2,0,3]
//total = 20 => output = [5,7,0,8]
//total = 40 => output = [5,10,0,12]

function allocate(input, total, output) {
  var rest = total; //остаток
  var quotient = Math.ceil(total/input.length); //частное
  var waste_count = 0; //счётчик превышений
  for( var i = 0; i < input.length; i++ ){
    output[i] = output[i] || 0;
    output[i] += quotient;
    rest -= quotient;
    if( output[i] > input[i] ) {
      var waste = output[i] - input[i];
      output[i] -= waste;
      rest += waste;
      waste_count++;
    }
    if( rest <= 0 ) {
      output[i] += rest;
      break;
    }
  }
//console.log(waste_count, rest, quotient);
  if( waste_count == input.length ) return output;
  if( rest > 0 ) return allocate(input, rest, output);
  return output;
}

console.log( allocate(input, 7, []) );
console.log( allocate(input, 20, []) );
console.log( allocate(input, 40, []) );
Ответить с цитированием