はじめに
エンジニアにとって夏と言えば...そう、映画「サマーウォーズ」です。
知らない人は、ぜひ2019年7月19日の金曜ロードショーか、DVDで見よう!!
映画の冒頭、"数学が得意な主人公の健二は、ヒロイン夏希の生年月日(1992年7月19日)から、その日が日曜日であることを秒殺で求める"というシーンがあります。
これを見たエンジニアはこう思うだろう"健二くんスゲー!!しゃべりながら一瞬で曜日を求めるとか頭にGPU入ってんのか!?"と。
頭にGPUが入ってない人でも、曜日を簡単に求める方法を見つけちゃいました。
準備物
- 今年(yyyy年)のカレンダー
- 紙
- 筆記用具
- すごろくのコマ(シャーペンのキャップなど)
- 調べたい年月日(YYYY年㎜月dd日)
方法概要
- カレンダーで今年の調べたい日付の曜日を確認
- うるう年を無視して曜日を計算
- うるう年を加味して計算結果を修正
具体的な方法
1.カレンダーで今年の調べたい日付の曜日を確認
調べたい日付の今年の曜日にコマを置く
ex.
調べたい日付が1992年7月19日、
今年が2019年なら
金曜日(2019年7月19日は金曜日)にコマを置く
2.うるう年を無視して曜日を計算
(今年(yyyy) - 調べたい年(YYYY)) % 7
("%"は割り算の余りを求めるという意味)
の分、コマを__左に__進める(もし日曜日まで行ったら、次は土曜日に進める)
ex.先の例の場合
(2019 - 1992) % 7 = 6
より以下のようになる。
3. うるう年を加味して計算結果を修正
YYYY以上の値の内、最も値が小さい値のうるう年(YYYY’)を求める。
ex.
YYYY = 1992 なら、YYYY' = 1992
YYYY = 1994 なら、YYYY' = 1996
さらに、以下の計算を行う
1月1日≦mm月dd日≦2月28日の時、
((yyyy - YYYY') / 4) % 7 +1
3月1日≦mm月dd日≦12月31日の時、
((yyyy - YYYY') / 4) % 7
("/"は割り算の商を求めるという意味)
求めた値の分、__左に__コマを進める
ex.先の例の場合
((2019 - 1992) / 4) % 7 = 6
よって
となる。
最後にコマのある位置が求めたい曜日になるので、夏希先輩の生まれた日は日曜日であることが分かる。
ちなみに2月29日の曜日を求める場合、2月28日を求めて最後に右に1つコマを進めればできます。
結論
モジュロ演算を知らなくても"簡単に"曜日を求められる。
会話しながら求めるにはやはり、頭の中にGPUが必要。
最後に
サマーウォーズ10周年イベントを楽しみましょう!!