JSFiddle - React, Tailwind, and code Playground
by CrossEye
HTML
<script src="https://rawgithub.com/CrossEye/ramda/master/ramda.js"></script>
<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, ", ");}
}());
// Using the Ramda functional library: https://github.com/CrossEye/ramda
ramda.installTo(this);
// Main function
var equalSplit = (function() {
var square = function(x) {return x * x;};
var variance = function(groups) {
var sizes = map(sum, groups),
mean = sum(sizes) / sizes.length;
return sum(map(pipe(subtract(mean), square), sizes));
};
var firstGroupChoices = function(group, count) {
if (group.length < 2 || count < 2) {return group;} // TODO: clone?
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 = map(function(choice){
return val(group.slice(choice.length), count - 1, soFar.concat([choice]));
}, choices);
return minWith(function(a, b) {return a.variance - b.variance;}, values);
};
return function(group, count) {
return val(group, count, []).groups;
}
}());
// Repeated here to use in the test function
var square = function(x) {return x * x;};
var variance = function(groups) {
var sizes = map(sum, groups),
mean = sum(sizes) / sizes.length;
return...