Сообщение от рони
|
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, []) );