Jolly Jumpers(1)
- ショート構文
たくさん問題を解いていると、以下のような形式のインプットが割と出てくることに気付く。
各行の一つ目の値が項数nで、その後にn個の整数が続くというものだ。この形式のインプットの場合、
n a1 a2 a3 a4 ... an
.
.
.
for(;~scanf("%d",&n);printf(...)) for(;n--;処理)scanf("%d",&a);
のように書くのはショートコーディングの基本形なわけだが、最近は強者コーダーが増えたこともあって、これでは全然通用しない。
というわけで、今まで基本形と考えていたものをさらに短縮しておく必要がある。
for(;~scanf("%d",&a);n||printf(...)) n--?処理:(n=a);
これでfor,scanfを一回にすることができた。
この型をベースとして、前回のコードを書き換えてみるとこのようになる。
これで20バイトほど短縮が出来た。あとは配列のリセット方法を考えつつ、処理系依存の汚いコードを書いていくことになる。
s['~~'],n,a,b,f,i;main(j){
for(;~scanf("%d",&a);i||puts(f?"Jolly":"Not jolly"))
i?j=abs(a-b),
n-i--?j/n|s[j]++?f=0:0:0,b=a:(memset(s,0,1e5),f=n=i=a);
}