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