[問題]
今年のカレンダーを作る
[出力]
#1\n Su Mo Tu We Th Fr Sa\n 1\n 2 3 4 5 6 7 8\n 9 10 11 12 13 14 15\n 16 17 18 19 20 21 22\n 23 24 25 26 27 28 29\n 30 31 \n #2\n Su Mo Tu We Th Fr Sa\n 1 2 3 4 5\n 6 7 8 9 10 11 12\n 13 14 15 16 17 18 19\n 20 21 22 23 24 25 26\n 27 28 \n #3\n Su Mo Tu We Th Fr Sa\n 1 2 3 4 5\n 6 7 8 9 10 11 12\n 13 14 15 16 17 18 19\n 20 21 22 23 24 25 26\n 27 28 29 30 31 \n #4\n Su Mo Tu We Th Fr Sa\n 1 2\n 3 4 5 6 7 8 9\n 10 11 12 13 14 15 16\n 17 18 19 20 21 22 23\n 24 25 26 27 28 29 30\n #5\n Su Mo Tu We Th Fr Sa\n 1 2 3 4 5 6 7\n 8 9 10 11 12 13 14\n 15 16 17 18 19 20 21\n 22 23 24 25 26 27 28\n 29 30 31 \n #6\n Su Mo Tu We Th Fr Sa\n 1 2 3 4\n 5 6 7 8 9 10 11\n 12 13 14 15 16 17 18\n 19 20 21 22 23 24 25\n 26 27 28 29 30 \n #7\n Su Mo Tu We Th Fr Sa\n 1 2\n 3 4 5 6 7 8 9\n 10 11 12 13 14 15 16\n 17 18 19 20 21 22 23\n 24 25 26 27 28 29 30\n 31 \n #8\n Su Mo Tu We Th Fr Sa\n 1 2 3 4 5 6\n 7 8 9 10 11 12 13\n 14 15 16 17 18 19 20\n 21 22 23 24 25 26 27\n 28 29 30 31 \n #9\n Su Mo Tu We Th Fr Sa\n 1 2 3\n 4 5 6 7 8 9 10\n 11 12 13 14 15 16 17\n 18 19 20 21 22 23 24\n 25 26 27 28 29 30 \n #10\n Su Mo Tu We Th Fr Sa\n 1\n 2 3 4 5 6 7 8\n 9 10 11 12 13 14 15\n 16 17 18 19 20 21 22\n 23 24 25 26 27 28 29\n 30 31 \n #11\n Su Mo Tu We Th Fr Sa\n 1 2 3 4 5\n 6 7 8 9 10 11 12\n 13 14 15 16 17 18 19\n 20 21 22 23 24 25 26\n 27 28 29 30 \n #12\n Su Mo Tu We Th Fr Sa\n 1 2 3\n 4 5 6 7 8 9 10\n 11 12 13 14 15 16 17\n 18 19 20 21 22 23 24\n 25 26 27 28 29 30 31\n[期間]
1/1(土)22:00 ~ 1/8(土)21:59
[hr]
=結果=
投稿数 34件(6人)
1位 (177B)
nissy さん 2位 (184B)
みけCAT さん
m,y=6,s[6],a;main(d){for(;++m-13;y&&puts(a+y*3))for(printf("#%d\n Su Mo Tu We Th Fr Sa\n%s",m,memset(a=s,32,21)+21-y*3),d=1;(4460848>>m*2&3)+d-32;printf((y=++y%7)?"%3d":"%3d\n",d++));}
五反田 さん
i=6,j,m;main(d){printf("#%d\n Su Mo Tu We Th Fr Sa\n",++m);for(j=i;i?printf(" ",--i):" @:@>@>@@>@>@"[m]/2>d;i||printf("%3d%c",d++,10|0>m*2&3)+d-32[/color][/font]
3位のコードは Q12 で使われた文字列による埋め込みです。
[font=Verdana][color=#000080]" @:@>@>@@>@>@"[m]/2[/color][/font]
式による埋め込みは高度ですが、適切な数式を発見できれば、固定データの埋め込みを上回るサイズ節約につながります。
さて、1位の式はどのように見つけたのでしょう?
nissy さんのコメントから補足:
基本的に 1月から7月の各月の日数は
[font=Verdana][color=#000080]30 + M%2[/color][/font]
で得られます(2月は例外)
それが8月以降は
[font=Verdana][color=#000080]30 + (M+1)%2[/color][/font]
となるので、
M = a+a/8 =a*9/8
とすることで、[font=Verdana][color=#000080]30 + M%2[/color][/font] の式をどの月にも共通して使えるようにしています。
[b]小手先のテクニックを自然に扱えるようにする[/b]
新年早々、ボリュームのある問題からスタートしました。
今回のランクインコードは、何をしているのかほとんど読み取れないかもしれません。
けれども、部分部分に着目すれば、今までの問題で紹介された多くのテクニックが利用されています。
第14回の問題は、初めての方にも優しい、比較的ライトな問題にしてみました。
新年を機に Code Golf の世界にチャレンジしてみるのも面白いかも!
種々のテクニックについては、過去の結果報告から復習できます。
みなさんの参戦をお待ちしています!
http://dixq.net/forum/viewforum.php?f=52
第14回の投稿受付中です。