[問題]
入力された1以上の数を階乗し、その値の各桁の和を出力する
階乗後の値は int の最大値以下である
[入力|例1]
1
[出力|例1]
1\n
[入力|例2]
5
[出力|例2]
3\n
[入力|例3]
12
[出力|例3]
27\n
[期間]
12/25(土)22:00 ~ 1/1(土)21:59
[hr]
=結果=
投稿数 22件(9人)
1位 (61B)
a5ua さん
main(x){scanf("%d",&x);printf("%d\n"," #$((%+++==F="[x]-34);}
nissy さん
main(a){scanf("%d",&a);printf("%d\n","_QRVVSYYYkktk"[a]-80);}
みけCAT さん
main(i){scanf("%d",&i);printf("%d\n","112663999KKTK"-48);}
4位 (74B)
五反田 さん
main(s){scanf("%d",&s);printf("%d\n",s<3?s:s-5?s<9?9-5/s*3:s-11?27:36:3);}
*1位1番乗り
a5ua さん
[hr]
★解説
今回のポイントは次の2つです。
文字列に数値を埋め込む
今回の問題は、Q8 でも活躍した「埋め込み」が効果的でした。
埋め込みは、そのデータサイズや個数に応じて、ビット埋め込み、文字列埋め込み、直接埋め込みなどを使い分けましょう。
埋め込みを使わない方法では、みけCAT さんの このコード(76B) が最短でした。
i,s;main(k){for(scanf("%d",&i);i?k*=i--:(s+=k%10,k/=10););printf("%d\n",s);}
インデックスの演算を節約する
今回埋め込みデータの参照に使われるインデックスは 1 ~ 12 で、0 がありません。
それを調整しようとすると、例えば1位のコードでは
"#$((%+++==F="[x-1] となりますが、文字列の先頭に空のデータを挿入することで、その演算を回避しています。
Code Golf に興味が出てきたら、コミュニティ「Code Golf を楽しもう」まで!
初心者歓迎、参戦&観戦いつでもお待ちしています!
http://dixq.net/forum/viewforum.php?f=52
第13回の投稿受付中です。
[hr]

今年もよろしくお願いいたします。