【ruby】曜日を計算する

アルゴリズム事典から「曜日」の項目をrubyで書き直してみた、

この本ではZellerの公式を用いて曜日を計算する方法が紹介されている。 Zellerの公式は以下の式を解くことで、曜日を数値として求めることができる。(y: 年、m:月、d:日)

dayofweek = (y + \frac{y}{4} - \frac{y}{100} - \frac{y}{400} + (2.6m + 1.6) + d) mod 7

このとき、1, 2月は前年の13, 14月と読み替える必要がある。また、グレゴリオ暦ユリウス暦かによって公式が変化する(上記はグレゴリオ暦用)ので、詳しくはWikipediaなどを参照されると良い。

本文中ではC言語で実装されているが、これをrubyで書き直してみた。

#! /usr/bin/env ruby

name = %w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

print "Year ? "; year = gets.chomp.to_i
print "Month? "; month = gets.chomp.to_i
print "Day  ? "; day = gets.chomp.to_i

if month < 3
  year -= 1
  month += 12
end

dayofweek = (year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + day) % 7
puts "It's #{name[dayofweek]}"

特に難しいことはなく、年月日を標準入力として渡すようにし、公式から結果を計算する。 曜日への翻訳は、0 -> Sunday, 1 -> Monday, ...となっている配列を使い書き換えている。

参考

ツェラーの公式 - Wikipedia

リンク