メモ

yukicoderでゆるふわgolf

yukicoder No.481 1から10

問題はこちら
No.481 1から10 - yukicoder

和を求めて55から引くのが一番簡単なように思う

int main(){
	int i,t,s=0;
	for(i=0;i<9;i++){
		scanf("%d",&t);
		s+=t;
	}
	printf("%d",55-s);
	return 0;
}

入力が昇順で与えられるので、1個ずつ読み取って、食い違いが生じた時点で終わらせる方法もある

int main(){
	int i,t;
	for(i=1;i<=9;i++){
		scanf("%d",&t);
		if(t!=i){
			printf("%d",i);
			return 0;
		}
	}
	puts("10");
	return 0;
}

答えが10になるとき、10回目のscanfは失敗してtの値が9のままであることを利用すれば最後の場合分けが要らなくなる

int main(){
	int i,t;
	for(i=1;i<=10;i++){
		scanf("%d",&t);
		if(t!=i){
			printf("%d",i);
			return 0;
		}
	}
}

ということでこの方針で縮めてみた

n;main(c){for(;scanf("%d",&c),++n==c||!printf("%d",n););}

RE
じゃあ最後までループを回すことにしよう

n;main(c){for(;~scanf("%d",&c);)++n-c&&printf("%d",n=c);}

RE
仕方がないのでとりあえずmain再帰で書くことにした

n;main(c){scanf("%d",&n);n-c?n=!printf("%d",c):main(c+1);}

58B

さて、現時点での最短コードを見ると、どうやら文字列のまま処理しているようだ
例えば1が欠けているとき、入力の文字コードの合計は、空白が8つ、改行が1つ、'0'~'9'が各1つで791になる

欠けている数 入力の文字コードの合計
1 791
2 790
9 783
10 743

9までは792から合計を引けば求まるが、10では余分に39減っている。
39……ということは13で剰余を取ればうまくいくな!

欠けている数 入力の文字コードの合計 mod 13
1 11
2 10
9 3
10 2

ということでこれを実装してこう

x;main(c){for(;read(0,&c,1);)x+=c;x=!printf("%d",12-x%13);}

59Bとなり、main再帰に1B及ばず。


2017/07/29追記
変数の役割を入れ替えることで1B短縮
コンパイラのバージョンアップによる3Bと合わせて4B短縮

c;main(n){scanf("%d",&n);n-++c?printf("%d",c):main();}

54B