実用Code Golf改々

実用Code Golf改の続き。十進小数の小数部を二進の循環小数表現に変換するJavaScriptの関数。

あと1文字短くする方法を見つけました。

// 元のコード: 139文字
function(f){s="",d=Math.pow(10,f.length),a=[];while((i=a.indexOf(f*=2))<0)a.push(f),s+=f<d?0:1,f%=d;return s.slice(0,i)+"("+s.slice(i)+")"}
// 短縮版1: 128文字
function(f){for(s="",d=eval("1e"+f.length),a={},j=0;!(i=a[f*=2]);a[f]=j++,s+=f/d|0,f%=d);return s.slice(0,i)+"("+s.slice(i)+")"}
// 短縮版2: 127文字
function(f){for(s="",d=eval("1e"+f.length),a={},j=0;!(i=a[f*=2]);s+=f/d|0,f%=d)a[f]=j++;return s.slice(0,i)+"("+s.slice(i)+")"}

工夫は次のとおりです。

破壊的更新をforの括弧の中と外にバラす

元のコード 短縮版
for(A;B;C,D); for(A;B;D)C;

ループ中の破壊的更新はforの中に書くこともできますし、後続する文に書くこともできます。このため、2つ以上の破壊的更新を行う場合、forの中と後ろにバラすことで、カンマがひとつ節約できます。