メモ

yukicoderでゆるふわgolf

yukicoder No.22 括弧の対応

問題はこちら
No.22 括弧の対応 - yukicoder

k番目の文字が「(」なら右へ、「)」なら左へ探すことになる
最初の文字も含めて、「)」に遭遇したら+1、「(」に遭遇したら-1として、初めて0になった箇所が求める位置

int main(){
	int n,i,t=0;
	char s[10010];
	scanf("%*d%d",&i);
	scanf("%s",s+1);
	n=s[i];
	//最初の文字を保存
	t=n*2-81;
	//')'は41,'('は40なので2倍して81を引くことで±1を作れる
	while(t)t+=s[n=='('?++i:--i]*2-81;
	//0になるまで動く
	printf("%d",i);
	return 0;
}

whileをforに書き直す
読み込みをgetsで行う
右へ動くか左へ動くかの判定n=='('?…は、nにs[i]ではなくs[i]*2-81を保存しておけばi-=nとできる

i,t;
char s['~~'];
main(n){
	scanf("%*d%d ",&i);
	//後ろにスペースをいれることで改行を読み飛ばし
	gets(s+1);
	for(t=n=s[i]*2-81;t+=s[i-=n]*2-81;);
	t=!printf("%d",i);
}

あとはいつもの

i,t;
char s['~~'];
main(n){
	for(gets(s+scanf("%*d%d ",&i)),n=t=s[i]*2-81;t+=s[i-=n]*2-81;);
	t=!printf("%d",i);
}

107B


2017/08/06追記
s[i]*2-81を2回も書いているのは無駄なのでぐっと睨んで1つにまとめる
コンパイラのバージョンアップによる3Bと合わせて11B短縮

n,t;
char s['~~'];
main(i){
	for(gets(s+scanf("%*d%d ",&i));t+=s[i-=n]*2-81;n=n?:t);
	printf("%d",i);
}

96B