問題はこちら
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