Rubyのプログラムで今月「日曜日」が何回あるのか教えてください。

nisyuさんとこより。

Rubyではいろんな人が答えているのでUNIXコマンドで。

もちろん、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とできるわけだ。