Parliament(6)
- 超絶テクニック(短縮その2)
前回のソースで
②不等号は出来れば'='を使いたくない。
の部分を改善し、
①mの初期値をわざわざ2にしているにもかかわらずあとで2を引いている。
i,m; main(t){ for(scanf("%d",&t);t-m>1;t+=~++m); for(;i<m;++i) printf("%d ",i+2+t/m+(i+t%m>=m)); }
これで93バイトになった。あとは不等式の中の'='を無くしていくことにする。
for(;i<m;++i) printf("%d ",i+2+t/m+(i+t%m>=m));
これは一見易しそうに見える。というのも、iのインクリメントをprintfの中ですれば良いだけだからだ。
for(;i<m;) printf("%d ",++i+1+t/m+(i+t%m>m));
しかし、こうすることがShort Coderに新たな誘惑を呼ぶことになる。
やってみればすぐにわかると思うが、iの初期値を1にしてしまうと終了判定の不等式に'='を入れなければならなくなるので②のルールに反してしまう。ここではまた、'~'のお世話になることにしよう。'~'をつけると絶対値が1増える。ならば、
iの初期値を1にすれば、+1のところを書かなくてもいいんじゃないかなぁ・・・
for(;i<m;) printf("%d ",t/m-~++i+t/m+(i+t%m>m));
このように書けばよい。ここまでで90バイトになる。もう少しだ!