メモ

yukicoderでゆるふわgolf

yukicoder No.486 3 Straight Win(3連勝)

問題はこちら
No.486 3 Straight Win(3連勝) - yukicoder


strstr関数を使うのが一番素直だと思う

#include <string.h>
int main(){
	char s[110],*x,*o;
	gets(s);
	x=strstr(s,"XXX");
	o=strstr(s,"OOO");
	if(x==NULL&&o==NULL)puts("NA");//どっちも見つからない
	else if(x==NULL&&o!=NULL)puts("East");//OOOだけ見つかる
	else if(x!=NULL&&o==NULL)puts("West");//XXXだけ見つかる
	else if(x<o)puts("West");//両方見つかったがXXXの方が先
	else puts("East");//両方見つかったがOOOの方が先
	return 0;
}

この方針で縮めるとこう

char s[110];x,o;main(){
	gets(s);
	x=strstr(s,"XXX");
	o=strstr(s,"OOO");
	x=!puts(x|o?x<o^x*o?"East":"West":"NA");
}

ただし、x,oが32bit整数として大小比較をしてうまくいくかは怪しい(実際には提出していない)

まあstrstrなんて使わなくても、前からreadしていけばいいよね

f,s,b;main(c){
	for(;read(0,&c,1);){
		if(!f){//まだ勝者が決まっていなければ
			if(b==c){//今の勝者が前回の勝者と同じなら
				s++;//連勝数を1増やして
				if(s==3)f=c;//3になった勝ち
			}else{//違うなら
				s=1;//連勝数は1になる
				b=c;
			}
		}
	}
	s=!puts(f?b&1?"East":"West":"NA");
}

ぐっと睨むと、sが3以上かどうかを見ればfがいらないことがわかる

s,b;main(c){
	for(;read(0,&c,1);)s<3&&b-c?b=c,s=1:++s;
	s=!puts(s>2?b&1?"East":"West":"NA");
}

89B