問題はこちら
No.203 ゴールデン・ウィーク(1) - yukicoder
順番に調べていくだけ
int main(){ char a[15]; int s=0,n=0,i; //sに現時点での最大連休数、nに現在の連休数を保存 gets(a);gets(a+7); //無理やり連結 for(i=0;i<14;i++){ if(a[i]=='o'){ n++; s=s<n?n:s; //休みなら連休数を増やして、最長記録と比較 } else n=0; //休みじゃなければ連休数を0に戻す } printf("%d",s); return 0; }
最大連休数の更新は、一見すると連休が終わったところ(elseのところ)でやってもいいように思えるけれど、14連休の時にだめ
これをぎゅっと縮める
char a[16]; i,s; main(n){ for(gets(gets(a)+7);a[i];)for(n=0;a[i++]&1;s=s<++n?n:s); i=!printf("%d",s); }
ループ圧縮
char a[16]; i,s,n; main(){ for(gets(gets(a)+7);a[i++]&1?s=s<++n?n:s:(n=0,a[i]);); i=!printf("%d",s); }
97B
16/10/01追記
なんで配列使ってるんですかね……
やるべきことは要するに
'o'が来たらs=s<++n?n:s
'x'が来たらn=0
改行が来たら何もしない
EOFが来たらループを抜ける
なのだから普通にgetchar(あるいはread)でいいじゃん…
s,n; main(i){ for(;i=~getchar();i%7?n*=i>-12:s<++n?s=n:1); s=!printf("%d",s); }
75B
readを使うとiに保存される値がbit反転するため、%7の部分を%37にしなければならず±0
2016/10/16追記
ぐっと睨むと、iが\nかxかの判別で1B縮む
s,n; main(i){ for(;i=~getchar();i%7?n*=~i%3:s<++n?s=n:1); s=!printf("%d",s); }
74B