カメヲラボ

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

Jolly Jumpers(1)

  • ショート構文

たくさん問題を解いていると、以下のような形式のインプットが割と出てくることに気付く。


n a1 a2 a3 a4 ... an
.
.
.
各行の一つ目の値が項数nで、その後にn個の整数が続くというものだ。この形式のインプットの場合、

for(;~scanf("%d",&n);printf(...))
  for(;n--;処理)scanf("%d",&a);

のように書くのはショートコーディングの基本形なわけだが、最近は強者コーダーが増えたこともあって、これでは全然通用しない。

というわけで、今まで基本形と考えていたものをさらに短縮しておく必要がある。

for(;~scanf("%d",&a);n||printf(...))
  n--?処理:(n=a);

これでfor,scanfを一回にすることができた。

この型をベースとして、前回のコードを書き換えてみるとこのようになる。


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);
}

これで20バイトほど短縮が出来た。あとは配列のリセット方法を考えつつ、処理系依存の汚いコードを書いていくことになる。