問題はこちら
No.627 ランダムウォークの軌跡 - yukicoder
言われたとおりにやる。
X[0]=0とするとT=1における場合分けをしなくて良くなるので楽
int x[999],t;
main(){
scanf("%d",&t);
for(int i=1;i<=t;i++)scanf("%d",x+i);
for(int i=1;i<=t;i++)if(abs(x[i-1]-x[i])!=1){
puts("F");
return 0;
}
puts("T");
}
縮める。
直前の値をa、今の値をbとして値の受け渡しをいい感じにする。
a,b,s;
main(i){
for(;~scanf("%d",&b);)--i?s|=abs(a-b)-1,a=b:0;
putchar(s?70:84);
}
78B
2018/01/22追記
実はもう1つ考えていた方針があった。
(a,b)→(b,*)と変換する必要があるわけだが、(b,a-b)にすることができれば、absに食わせる引数との兼ね合いで上手く縮むのではないか
s,a,b;main(i){for(;~scanf("%d",&b);)s|=--i&&abs((b-=a,a+=b,b))-1;putchar(s?70:84);}
s,a,b;main(i){for(;~scanf("%d",&b);)s|=--i&&abs(b,a+=b,b-=a)-1;putchar(s?70:84);}
s,a,b;main(i){for(;~scanf("%d",&b);s|=--i&&abs(b,a+=b-=a)-1);putchar(s?70:84);}
これ自体は79Bだが、「ワイド文字列リテラル」というものと組み合わせることで短縮ができる。
ワイド文字列とは文字列の亜種のようなもので、1文字を2Bまたは4Bで表す型(らしい)。L"string"というように、頭にLをつけて記述する。
実態としては(char*)L"XYZ"は"X\0\0\0Y\0\0\0Z\0\0\0"と等しいので、次のように短縮できる
s,a,b;main(i){for(;~scanf("%d",&b);s|=--i&&abs(b,a+=b-=a)-1);putchar(s?70:84);}
s,a,b;main(i){for(;~scanf("%d",&b);s|=--i&&abs(b,a+=b-=a)-1);puts(L"TF"+s);}
76B