うらおブログ(移転しました)スマートフォン用の表示で見るやねうらおブログ(移転しました)この広告は、90日以上更新していないブログに表示しています。2005-12-06コードを短くするのって楽しいですよね?(11)program紆余曲折の結果、wajさんによって究極のコードが提起された。それは、2.5進数を使うというものだった。問題点をクリアにしよう。意味するところは、2で割った結果が0になったとき、すなわち、その1step前ではdが1のときという意味になる。よって、forループを脱出する直前のputsでは、noが表示される。2つのInputの最後のテストケースがnoならばこれでいいのだが、あいにく、片方はno,片方はyesである。よって、このプログラムではいけない。この問題を回避するために我々は3進数を導入した。/=2の部分を/=3に変更した。この結果、xxxの部分は3文字から4文字に。yyの部分は2桁から3桁になった。意味するところは、3で割った結果が0になったとき、すなわち、その1step前ではdが1か2のときという意味になる。よって、forループを脱出する直前のputsするときに、yesかnoかの出力を選択する余地がある。これに対し、wajさんの提起したその究極のコードとは、こうだ。部分が何とも怪しげだ。shiftのために2で割っていくのが2進数、3で割っていくのが3進数。.4は、0.4の意味であり、2/5倍。5/2で割っているから、これは5/2=2.5進数だ。2.5進数で表すことによって、定数部を'zMM'と90というように1文字ずつ削ることが可能になった。そのかわり、d/=3がd*=.4と1文字増えるのでトータルでは、1文字減。これで61byteだ。意味するところは、0.4を掛けた結果が0になったとき、すなわち、その1step前ではdが1か2のときという意味になる。よって、forループを脱出する直前のputsするときに、yesかnoかの出力を選択する余地がある。以下、この2.5進数の定数をどうやって決定しているのか簡単に説明しておく。a以上b未満を意味するものとする。集合を意味するものとする。d*=.4を実行したとき、d=1になる数が欲しいとする。dはint型だから暗黙のうちに小数部が切捨てられる。このとき、d*=.4のあと、d=1になる偶数のほうのdを選択したいなら、{3,4}のうち4のほうを選択しておけばいい。}のうち、5か7を選択すればいい。ところで0.4以外にはダメなのだろうか?いま2.5進数で考えたが、a進数ではどうなるか考えてみよう。