カメヲラボ

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

Jolly Jumpers(2)

  • 無駄をなくしていこう

まず、memsetがイケてないのでmallocを使うことでコードの長さを縮める。開放しなくてもMemory Limitにはならなかった。


*s,n,b,f,i;

main(a){
for(;~scanf("%d",&a);i||puts(f?"Jolly":"Not jolly"))
i?n-i--?s[abs(b-=a)]++|b/n?f=0:0:0,b=a:
(s=malloc(5e7),f=n=i=a);
}

mallocのおかげで配列宣言の文字リテラルが省略できるので、大幅にコードが短くなる。さらに処理系依存で一時変数jも取り除く。ここからさらに、無駄が多いfの扱いを考える。fの初期値は0にしておき、"Not jolly"の条件を満たしたところでfの値を増やすことにしておけば、無駄な0や代入文が省ける。

*s,n,b,f,i;

main(a){
for(;~scanf("%d",&a);i||puts(f?"Not jolly":"Jolly"))
i?f=n-i--?f+s[abs(b-=a)]++|b/n:0,b=a:
(s=malloc(5e7),n=i=a);
}

これで131バイト。ここからは、さらにダーティーコードを書いていくことになる。