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]