JSFiddle - React, Tailwind, and code Playground

by robgallen

HTML

<form>
  Capacity required: <input type="text" id="capacity" value="1850000" />
  # planets: <select id="planets">
    <option>8</option>
    <option>9</option>
    <option>10</option>
    <option>11</option>
    <option selected="selected">12</option>
    <option>13</option>
    <option>14</option>
    <option>15</option>
    <option>16</option>
  </select>
  <button id="btn" type="button">Go</button>
</form>
<hr />
<div id="feedback"></div>

CSS

body {
  font-family: sans-serif;
}

JavaScript

var feedback = $('#feedback');
var creditStorage = [1000, 1400, 1800, 3000, 4000, 5000, 6000, 7500, 10000, 13000, 16000, 20000, 24000, 28000, 35000, 45000, 65000, 90000, 130000, 170000, 210000, 250000, 290000, 330000, 370000, 410000, 450000, 490000, 530000, 570000, 610000, 650000, 690000, 730000, 770000, 810000, 850000, 850000, 850000, 850000];
var planetLevels = [];

function startCalc () {
	feedback.html('');
  var capacity = $('#capacity').val();
  var planets = $('#planets').val();
  
  var planets1to4 = creditStorage[15-1] * 4;
  var planet5 = creditStorage[20-1];
  planetLevels = [15, 15, 15, 15, 20];
  var remainingCapacity = capacity - planets1to4 - planet5;
  var remainingPlanets = planets - 5;
  
  addFeedback('Starter planets 1-5 have capacity of ' + (planets1to4 + planet5));
  addFeedback('Planets left: ' + remainingPlanets);
  addFeedback('Capacity left: ' + remainingCapacity);
  addFeedback('Planet levels so far ' + planetLevels.toString());
  addFeedback('...');
  
  loopCalc(remainingCapacity, remainingPlanets);
}

function loopCalc (remainder, p) {
	var mean = remainder / p;
	var index = creditStorage.findIndex(p => {
    return (p >= mean);
  });
  var credits = creditStorage[index];
  var level = index + 1;
  
  if (p <= 1) {
  	planetLevels.push(level);
    addFeedback('Done');
    addFeedback('Planet levels so far ' + planetLevels.toString());
  	return;
  };
  
  var halfPlanets = Math.floor(p / 2);
  var remainingPlanets = p - halfPlanets;
  while (halfPlanets--) {
  	planetLevels.push(level);
    remainder = remainder - credits;
  }
  
  addFeedback('Planets left: ' + remainingPlanets);
  addFeedback('Capacity left: ' + remainder);
  addFeedback('Planet levels so far ' + planetLevels.toString());
  addFeedback('...');
  
  loopCalc(remainder, remainingPlanets);
}

function addFeedback (msg) {
	var existing = feedback.html();
  msg = existing + '<br/>' + msg;
	feedback.html(msg);
}

$('#btn').on('click', startCalc);