Best shuffle: Difference between revisions

Javascript implementation
(Add scheme)
(Javascript implementation)
Line 87:
a, a (1)
</lang>
 
=={{header|Javascript}}==
 
Based on the J implementation (and this would be a lot more concise if we used something like jQuery):
 
<lang javascript>function raze(a) {
var r= [];
for (var j= 0; j<a.length; j++)
for (var k= 0; k<a[j].length; k++)
r.push(a[j][k]);
return r;
}
function bestShuf(txt) {
var chs= txt.split('');
var gr= {};
var mx= 0;
for (var j= 0; j<chs.length; j++) {
var ch= chs[j];
if (null == gr[ch]) gr[ch]= [];
gr[ch].push(j);
if (mx < gr[ch].length) mx++;
}
var inds= [];
for (var ch in gr)
inds.push(gr[ch]);
var ndx= raze(inds);
var cycles= [];
for (var k= 0; k < mx; k++)
cycles[k]= [];
for (var j= 0; j<chs.length; j++)
cycles[j%mx].push(ndx[j]);
for (var k= 0; k < mx; k++)
cycles[k].push(cycles[k].shift());
var prm= raze(cycles);
var shf= [];
for (var j= 0; j<chs.length; j++)
shf.push(chs[prm[j]]);
return shf.join('');
}
 
function disp(ex) {
var r= bestShuf(ex);
var n= 0;
for (var j= 0; j<ex.length; j++)
if (ex.substr(j, 1) == r.substr(j,1))
n++;
return ex+', '+r+', ('+n+')\r\n';
}</lang>
 
Example:
 
<lang html><html><head><title></title></head><body><pre id="out"></pre></body></html>
<script type="text/javascript">
/* ABOVE CODE GOES HERE */
var sample= ['abracadabra', 'seesaw', 'elk', 'grrrrrr', 'up', 'a']
for (var i= 0; i<sample.length; i++)
document.getElementById('out').innerHTML+= disp(sample[i]);
</script></lang>
 
Produces:
 
<lang>abracadabra, bdabararaca, (1)
seesaw, easews, (0)
elk, lke, (0)
grrrrrr, rgrrrrr, (5)
up, pu, (0)
a, a, (1)</lang>
 
=={{header|PicoLisp}}==
6,962

edits