メモ

yukicoderでゆるふわgolf

yukicoder No.305 鍵(2)

問題はこちら
No.305 鍵(2) - yukicoder

writer解と同じ発想
ある桁の数字を変えた時、当たり数が大きくなれば新しい方が当たり、小さくなれば古い方が当たり。これを繰り返して上の桁から順に調べていく

char s[]="0000000000";
n,k,i;
main(){
	puts(s);
	fflush(0);
	scanf("%d%*s",&n);
	for(;k<10;){
		puts(s);
		fflush(0);
		scanf("%d%*s",&k);
		if(k!=n){
			k>n?n=k:s[i]--;
			i++;
			continue;
		}
		s[i]++;
	}
}

scanfが2つあるのでこれを1つにまとめる
また、読み込みはgets+atoiでできる

char s[]="0000000000";
n,k;
main(i){
	for(n=i=-1;k<10;k>n?n=k:s[i]--,i++)
		for(;puts(s),fflush(0),k=atoi(gets(&k)),k==n;s[i]++);
}

ループ圧縮
また、kを1増やすことでnの初期化は不要(-2B+2B)、iの符号を逆にすることでiの初期化は不要(-4B+2B)

for(n=i=-1;k<10;k>n?n=k:s[i]--,i++)for(;puts(s),fflush(0),k=atoi(gets(&k)),k==n;s[i]++);
for(n=i=-1;puts(s),fflush(0),k=atoi(gets(&k)),k-n?k>n?n=k:s[i]--,i++,k<10:s[i]++;);
for(;puts(s),fflush(0),k=atoi(gets(&k))+1,k-n?k>n?n=k:s[-i]--,i--,k<11:s[-i]++;);

というかそもそもポインタを使えばiそのものが不要。1B短縮

char s[]="0000000000",*p=s-1;
k;
main(n){
	for(;puts(s),fflush(0),k=atoi(gets(&k))+2,k-n?k>n?n=k:--*p,p++,k<12:++*p;);
}

115B

文字列を使わずに数のまま扱うのも考えたが、初期化がうまく噛み合わないなどして120Bとなった

long s,k,i;
main(n){
	for(;printf("%010ld\n",s),fflush(0),k=atoi(gets(&k))+2,k-n?k>n?n=k:(s-=i),i=i*10?:1,k<12:(s+=i,1););
}


2017/09/13追記
atoi(gets())+2としていたところを~atoi(gets())とすることで1B短縮
putsをfflushの引数に押し込んで自明に1B短縮

char s[]="0000000000",*p=s-1;
k;
main(n){
	for(;fflush(!puts(s)),k=~atoi(gets(&k)),k-n?k<n?n=k:--*p,p++,k+11:++*p;);
}

113B