2011年6月19日日曜日

anarchy golf - NABEATSU of the world 解答編

anarchy golf - NABEATSU of the world

さて、これもどう縮めたもんか悩んでいましたが。

直感的に文字列変換後に3が含まれているかチェックすべきと思ったので
このようなコードになりました。

main(i,s){for(;i<301;puts(i++%3*!strchr(s,51)?s:"aho"))sprintf(s,"%d",i);}

ただ、関数名が長いしsprintfではポインタ返してくれないのでitoaが使えないか試行錯誤してました。


そして、トップがこちら。
main(i,s){for(;i<301;)puts(i++%3>index(gcvt(i+0.,9,s),51)?s:"aho");}

見慣れない関数gcvtですが、Manpage of GCVTのとおり数字を文字列に変換する古い関数です。
引数がdoubleのため、0.を足しています。
文字列のポインタを返してくれる上に短いという、こんなのがあったのかって感じです。
indexもstrchrと同様の機能の古い関数。

こう考えてみるとアルゴリズムとしてはほぼ同じことがわかります。
ただ、最後の一手、3の倍数か3が含まれているときというのを比較演算子で判定するのはすごいですね。

0 件のコメント:

コメントを投稿