[問題]
与えられた整数c(1≦c≦9)に対して、
1以上100以下の整数のうち「cの倍数またはcが付く数字」すべてを昇順に出力する。
1つの行に1つの数字を出力するものとし、余計な文字や改行が含まれてはならない。
※最後の行に改行を入れるのはOKです
また、「cが付く数字」とは値がcである桁が存在する数字である。
9つの入力に対し、少なくとも2つについて正しい出力が得られれば正解とする。
[期間]
3/26(土)22:00 ~ 4/2(土)21:59
[hr]
=結果=
投稿数21件(7人)
1位 (60B)
kimuchi さん
i;main(n){for(gets(&n);4>printf("%d\n",i+=i/10-n?n%=8:1););}
2位 (62B)
matsu さん
i;main(t){for(gets(&t);i<100;printf("%d\n",i+=i/10-2?t&3:1));}
あーる さん
i;main(n){for(gets(&n);printf("%d\n",i+=n%2||i/10==2?:2)-4;);}
みけCAT さん
k;main(i){for(gets(&i);k<100;)printf("%d\n",k+=k/10-2?i&3:1);}
*1位1番乗り
kimuchi さん
[hr]
★解説
たくさんのご投稿をいただけて,たいへん嬉しく思います.
また,想定よりも短いコードがたくさん送られてきて,出題者としても楽しませていただきました.
せっかくの機会なので,普段とは違うタイプの問題を出してみようということで,
テストケースの解析により短縮を狙う問題を作ってみました.いかがでしたでしょうか.
少しでも楽しんでいただけたなら幸いです.
さて,解説ですが,入力の狙い目としては,c = 1, 2, 5 の3通りです.
これらの入力については,以下のような短縮を行うことが出来ます.
- 1桁目がcであるかを判定しない
1桁目がcならば必ずcの倍数なので,この判定を省略できます.
- 条件を満たす数字の増分に注目する
出力例を見ると,10の位がcのときは1ずつ,それ以外のときはcずつ,出力する値が増加しています.
なので,10の位だけを見て,条件を満たす数字を列挙する事も可能です.
- 入力を文字として読み込む
文字コードは,'1'が49,'2'が50,'5'が53なので,
getsなどを使って文字として読んだ値に対し,8で割った余りを取る事で入力の数字を得られます.
- 100を出力した時点で終了する
c=1, 2, 5はいずれも,最後に100を出力して終了します.
printfは出力バイト数を返すので,「初めて4バイト以上を出力するときに終了する」と考えることで,
終了判定を短縮することができます.