Rubyのプログラムで今月「日曜日」が何回あるのか教えてください。
nisyuさんとこより。
もちろん、WindowsユーザはCygwinで。
bash-3.00$ cal | cut -b 1-2 | grep -c [0-9] 5
ド━(゚Д゚)━ ン !! なぜこうなるかというと、calコマンドで
bash-3.00$ cal October 2005 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
で、1〜2バイト目をcutして
bash-3.00$ cal | cut -b 1-2 Su 2 9 16 23 30
となるわけだからさ。
ちなみに、この質問が「木曜日」「金曜日」の場合、このコマンドでは
bash-3.00$ cal | cut -b 13-14 20 Th 6 13 20 27
2005年の"20"が入ってしまい、1行余計にカウントされる!! ド━(゚Д゚)━ ン !!
よって(この問いの解答にはオーバースペックだが)全曜日対応したければcalの出力をtailで下から6行切り取ればよい!!!
bash-3.00$ cal | tail -6 | cut -b 13-14 | grep -c [0-9] 4
余談 calコマンドの出力は常に6行か?
ほとんどの1ヶ月=30 or 31日なので、1週間=7日間で割れば、最低5週あれば1ヶ月のカレンダーは表現できる。
また、1ヶ月が28日しかない2月は最低4週(2月1日が日曜の場合、28÷7=4)で表現可能である。
したがって、西暦(グレゴリオ暦)の仕様から考えると、calコマンドの出力フォーマットが常に「見出し+曜日ヘッダー+日付(6週)」である保証はない。
しかし、以下のように年単位で一覧表示することを考えると、月ごとに表示行数を変えることはできないため、日付はいつも最大6行で表示しているものと思われる。
bash-3.00$ cal 2005 2005 January February March Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 1 2 3 4 5 1 2 3 4 5 2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12 9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 19 16 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 26 23 24 25 26 27 28 29 27 28 27 28 29 30 31 30 31 April May June Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 7 1 2 3 4 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11 10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18 17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25 24 25 26 27 28 29 30 29 30 31 26 27 28 29 30 July August September Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 1 2 3 3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10 10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17 17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24 24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30 31 October November December Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 1 2 3 4 5 1 2 3 2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10 9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 17 16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24 23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31 30 31 bash-3.00$
念のため西暦11年の2月で試してみよう。
bash-3.00$ cal 2 11 February 11 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 bash-3.00$
見てのとおり、これで安心してtail -6とできるわけだ。