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
}