JSFiddle - React, Tailwind, and code Playground
by ozzon91
JavaScript
const piratePair = [
{ portion:10, grow:1, shrink:1 },
{ portion:10, grow:1, shrink:1 },
];
const bossAndHenchman = [
{ portion:10, grow:4, shrink:1 },
{ portion:10, grow:1, shrink:4 },
];
const pirates1 = [
{ portion:200, grow:1, shrink:1 },
{ portion:50, grow:1, shrink:1 },
{ portion:130, grow:1, shrink:1 }
];
const pirates2 = [
{portion: 210, grow: 1, shrink: 1},
{portion: 40, рост: 1, shrink: 1},
{portion: 130, grow: 2, shrink: 2}
];
console.log(divideLoot(20, piratePair));
console.log(divideLoot(30, piratePair));
console.log(divideLoot(10, piratePair));
console.log(divideLoot(30, bossAndHenchman));
console.log(divideLoot(10, bossAndHenchman));
console.log(divideLoot(200, pirates1));
console.log(divideLoot(140, pirates2));
function divideLoot(loot, pirates) {
let portionSum = 0;
let growSum = 0;
let shrinkSum = 0;
let result = [];
const pl = pirates.length;
pirates.forEach(pirate => {
portionSum += pirate.portion;
growSum += pirate.grow;
shrinkSum += pirate.shrink;
});
diffLoot = loot - portionSum;
let zeroVals = 0;
let newLoot = 0;
pirates.forEach(pirate => {
if(diffLoot > 0) {
let growSize = diffLoot/growSum;
let r = pirate.portion + pirate.grow*growSize;
result.push(r);
} else {
let shrinkSize = Math.abs(diffLoot/shrinkSum);
let r = pirate.portion - pirate.shrink*shrinkSize;
if(r < 0) {
zeroVals++;
}
if(r > 0) newLoot += r;
result.push(r > 0 ? r : 0);
}
});
let o = newLoot - loot;
if(o > 0 && diffLoot < 0) {
let normalize = o/(pl-zeroVals);
result = result.map(p => {
if(p >0) p -= normalize;
return p;
})
}
return result;
}
// -> [135, 0, 65]