LCM in js (2) - for col processing

by Ben Clayton

HTML

<h3>Multicol Migration Algolrythme</h3>

<div id="op"></div><br/>

CSS

div {display:inline-block;margin-left:30px;}
.exp {color:red;}

JavaScript

function test(cols,expect){
    var gcols = [];
    var sm=smallest(cols);
    var m = (100/sm);
    var r = 0.1; // round to nearest
    var frac=0;
    for (var i=0;i < cols.length ; i++){
        gcols[i] =  parseInt((cols[i]*m/100/r)+0.5,10)*r;
        if (gcols[i] != parseInt(gcols[i],10) ) frac=1;
    }
    op +="<hr>Percent Cols: " + cols.map(function(v){return v+'%'}).join(', ') + "<br/>";
    op +="Expected: <span class='exp'>" + expect+ "</span><br/><br/>";
    op +="M: " + m + "<br/><br/>";
    op +="Got:<b> " + gcols.join(', ') + "</b><br/><br/>";
    if(frac){
        op +="Fractions present so use</b><br/>";
        op +="use: " + cols.map(function(v){return parseInt(v+0.5,10)}).join(', ') + " ?<br/>";
        for (var i=0;i < cols.length ; i++){
            gcols[i] *= 10;
        }
        var sm = smallest(gcols);
        frac=1;
        var d=sm+1;
        while(frac && (d>1) ){
            frac=0;
            d--;
            for (var i=0;i < cols.length ; i++){
                var v=gcols[i]/d ;
                if (v != parseInt(v,10) ) frac=1;
            }
        }    
        for (var i=0;i < cols.length ; i++){
            gcols[i] = gcols[i] / d;
        }
        op +="best use: " + gcols.join(', ') + " <br/>";    
    }

    $('#op').html(op)
}

test([33.33,66.66,33.33],"1,2,1");
test([20,60,10,10],"2,6,1,1");
test([33.333,67,33.33],"1,2,1");
test([33.3,66.66],"1,2");
test([33.3,22.1,22.1,22.1],"3,2,2,2");

test([54,48,36],"27,24,18?");

function smallest(arr){
    var sm=null;
    for (var i=0;i < arr.length ; i++){
        if(!sm ||  arr[i] < sm){
            sm=arr[i];   
        }
    }
    return sm
}