十進小数の小数部を二進の循環小数表現に変換する関数を書いてみました。
function repeatingBinary(decimalFractionPart) { var digits = ""; var numerator = parseInt(decimalFractionPart) * 2; var denominator = Math.pow(10, decimalFractionPart.length) var ns = []; var ind; while ((ind = ns.indexOf(numerator)) < 0) { ns.push(numerator); digits += (numerator >= denominator ? "1" : "0"); numerator = (numerator % denominator) * 2; } return digits.slice(0, ind) + "(" + digits.slice(ind) + ")"; }
たとえば、十進の0.05は二進で0.000011001100110011...という循環小数になるため、repeatingBinary("05")は"00(0011)"を戻します。
この関数は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)+")"}
このように、プログラムをできる限り短く書くことをCode Golfと呼びます。Code Golfは無益な悪ふざけと思われがちですが、それは大きな間違いです。140文字以下に切り詰めると、Twitterに投稿できるという実益が得られるからです。
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)+")"}
— 宮川 拓 (@miyakawa_taku) 2015, 3月 29
もちろん、現実逃避の役にも立ちます。