メモ

yukicoderでゆるふわgolf

yukicoder No.273 回文分解

問題はこちら
No.273 回文分解 - yukicoder

不要な部分は1文字にバラしてしまえば良いので、全体でない最長の回文の長さが求める値になる

int main(){
	char s[99];
	int i,j,k,f=1;
	//fはフラグ。0になったら回文が見つかった
	gets(s);
	for(i=strlen(s);f&&--i;){
		//長さiの回文を探す
		for(j=0;f&&s[j+i-1];j++){
			//s[j]から始まるi文字が回文かどうか調べる
			f=0;
			for(k=0;k<i/2;k++)if(s[j+k]!=s[j+i-1-k])f=1;
		}
	}
	printf("%d",i);
	return 0;
}

iを1つずらして

char s[99];
i,j,k;
main(f){
	for(i=strlen(gets(s))-1;f&&--i;)
		for(j=0;f&&s[j+i];j++)
			for(k=0;k<=i/2&&!(f=s[j+k]-s[i+j-k]);k++);
	i=!printf("%d",i+1);
}

for文圧縮

for(j=0;f&&s[j+i];j++)for(k=0;k<=i/2&&!(f=s[j+k]-s[i+j-k]);k++);
for(j=0;k>i/2|(f=s[j+k]-s[i+j-k])?k=0,f&&s[++j+i]:++k;);

for(i=strlen(gets(s))-1;f&&--i;)for(j=0;k>i/2|(f=s[j+k]-s[i+j-k])?k=0,j++,f&&s[j+i]:++k;);
for(i=strlen(gets(s))-2;k>=i/2|(f=s[j+k]-s[i+j-k])?k=0,f&&s[++j+i]?:(j=0,f&&--i):++k;);
//元の文字列の長さが2のとき、i=0でも元の2つ目for文にあたる部分が実行されてしまうので、k>=i/2とした

ということで

char s[99];
i,j,k;
main(f){
	for(i=strlen(gets(s))-2;k>=i/2|(f=s[j+k]-s[i+j-k])?k=0,f&&s[++j+i]?:(j=0,f&&--i):++k;);
	i=!printf("%d",i+1);
}

133B

2017/07/25追記
strlen(gets())の代わりにreadを使うテクニックを学んだ。

char s[99];
i,j,k;
main(f){
	for(i=read(0,s)-3;k>=i/2|(f=s[j+k]-s[i+j-k])?k=0,f&&s[++j+i]?:(j=0,f&&--i):++k;);
	printf("%d",i+1);
}

124B