カメヲラボ

主にプログラミングとお勉強全般について書いてます

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バイトになる。もう少しだ!