読者です 読者をやめる 読者になる 読者になる

A Perfect Night For Bananafish

だがそれを語るには人生は短すぎる

5のつく水曜日を数える

Technotes

5のつく日(5日、15日、25日)でかつ、水曜日となる日がその年に何個あるのかを知りたい

という旨のツイートを見かけたので考えてみた。なんかキャンペーンとかイベントでもあるんだろうか。

概算

統計的に推測してみる。数年前に流行ったフェルミ推定的なアレ。
5のつく日は上でも述べたように毎月、5日、15日、25日の3日ある。
つまり年間で3*12=36日の5のつく日がある。
この中から水曜日だけを選ぶのだから曜日数の7で割って

36/7= 5.14285714

つまり5のつく水曜は5日ちょっとあるという見積もりとなった。

ところでカレンダーをみて2013年の5のつく日を数えると4日だ。

ちゃんとする

もう少し具体的に計算することにする。
考え方はいろいろあると思うのだけど、カレンダーを眺めた結果、
5日、15日、25日の曜日を全部調べても良いのだけれど、

  • 5日(水)→1日(日)
  • 15日(水)→1日(水)
  • 25日(水)→1日(土)

で、各月の中で5のつく日の曜日が重なることはなく、2日以上存在する月はない。
つまり(日)(水)(土)で始まる月の数を数えるだけでよい。

もう少しパターンを広げて、うるう年かどうかと元旦の曜日がわかれば…とかできるけど
その辞書を作るのが面倒なのでやめて、この辺で長いこと触ってなかったrubyで書いてみた。

5のつく水曜の数を求めるだけという汎用性のなさ!

第1引数に年を入れると5のつく水曜日の数を出力する。
count_wed5.rb

#!/usr/bin/ruby
require 'date'
year=ARGV[0].to_i
if year < 1 then
  puts 'Usage: '+$0+' year'
  exit
end 

count=0
# 各月の1日が0:日,3:水,6:土の数を数える
(1..12).each { |month|
  day=Date::new(year,month,1) 
  if day.wday%3 == 0 then
    count+=1
  end
}
puts count 

実行結果

$ ruby ./count_wed5.rb 2013
4

ちなみに

いろんな年を実行すると5のつく水曜日の数は3日~7日で揺れており、
2013~3013の千年で平均すると
5.14185814185814
となり、最初の推定に近づく。よかったですね!(別によくない)