01

13

[Ruby] 13日の金曜日が毎年あることを証明しなさい

2012.01.13(23:14)

今日は、13日の金曜日。

13日の金曜日が毎年あることを証明しなさいという問題をツイッターでみかけました。

13日が金曜日である月は1日が日曜日なので、1日が日曜日である月が毎年あることを証明すればよいことになります。

でも、ほんとうにそうなのかなあと、確認するプログラムをRubyで書いていました。


a = [31,28,31,30,31,30, 31,31,30,31,30,31]

b = []
0.upto(11) {|n|
s = 0
0.upto(n-1) {|m|
s += a[m]
}
b << s
}
p b.map{|n|n%7}


1月の1日が日曜日だとした場合、各月の1日はそれぞれ何曜日か求めるプログラムです。0=日曜日、1=月曜日、以下同様に、6=土曜日です。
これを実行すると、


[0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5]


となりました。これを眺めていて、5月から11月までが、1,4,6,2,5,0,3 となっていて、0から6までが1回ずつ現れていることに気がつきました。つまりこれって、

5月から11月までの7か月は、1日の曜日がすべて異なる、ということ。

5月から11月までの7か月は、平年もうるう年も、月の日数は同じです。

もちろん、曜日の種類は7種類しかありません。

このことから、

5月から11月までの7か月のうち、どこかの月は必ず日曜日である、と導けます。

今年、2012年の場合、5月から11月までの1日の曜日は、火金日水土月木。

証明する前に、結論が出てしまいました。う~ん。

せっかくなので、ツイッターでつぶやけるよう、140文字以内でプログラムをこしらえてみました。


5月から10月まで6か月間の月の日数を配列にいれた、
[31,30,31,31,30,31]を用意して、

a=Array.new(7,0)
7.times{|m|
  m.times{|n|
    a[m] += [31,30,31,31,30,31][n]
  }
}
p a.map{|n|n%7}.sort

実行結果は
[0,1,2,3,4,5,6]


おしまい。

コメントの投稿

非公開コメント

プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示