JSFiddle - React, Tailwind, and code Playground
HTML
<pre><code id="output"></code></pre>
JavaScript
// Just for displaying output
var log = (function() {
var o = document.getElementById("output");
return function() {o.innerHTML += "\n" + [].join.call(arguments, ", ");}
}());
// Main function
var equalSplit = (function() {
var sum = function(list) {return list.reduce(function(a, b) {
return a + b;
}, 0);};
var square = function(x) {return x * x;};
var variance = function(groups) {
var sizes = groups.map(sum),
mean = sum(sizes) / sizes.length;
return sum(sizes.map(function(size) {return square(size - mean);}, sizes));
};
var firstGroupChoices = function(group, count) {
if (group.length < 2 || count < 2) {return group;}
var mean = sum(group) / count;
var current = 0, next = group[0], idx = 0;
do {
current = next;
next = next + group[++idx];
} while (next < mean);
if (next === mean) {
return [group.slice(0, idx + 1)]
} else {
return [
group.slice(0, idx),
group.slice(0, idx + 1)
];
}
};
var val = function(group, count, soFar) {
if (count <= 0 || group.length == 0) {
return {groups: soFar, variance: variance(soFar)};
}
if (count == 1) {
return val([], 0, soFar.concat([group]));
}
var choices = firstGroupChoices(group, count);
var values = choices.map(function(choice){
return val(group.slice(choice.length), count - 1, soFar.concat([choice]));
});
return values.sort(function(a, b) {return a.variance - b.variance;})[0];
};
return function(group, count) {
return val(group, count, []).groups;
}
}());
// Repeated here to use in the test function
var sum = function(list) {return list.reduce(function(a, b) {
return a + b;
}, 0);};
var square = function(x) {return x * x;};
var variance = function(groups) {
var sizes =...