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...