問題はこちら
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に食わせる引数との兼ね合いで上手く縮むのではないか
//(a,b)→(b,b-a)と変換 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