0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

【サマーウォーズのアレ】モジュロ演算知らなくても夏希先輩の生まれた曜日がわかっちゃうってよ!!

はじめに

エンジニアにとって夏と言えば...そう、映画「サマーウォーズ」です。
知らない人は、ぜひ2019年7月19日の金曜ロードショーか、DVDで見よう!!
映画の冒頭、"数学が得意な主人公の健二は、ヒロイン夏希の生年月日(1992年7月19日)から、その日が日曜日であることを秒殺で求める"というシーンがあります。
image.png
これを見たエンジニアはこう思うだろう"健二くんスゲー!!しゃべりながら一瞬で曜日を求めるとか頭にGPU入ってんのか!?"と。
頭にGPUが入ってない人でも、曜日を簡単に求める方法を見つけちゃいました。

準備物

  • 今年(yyyy年)のカレンダー
  • 筆記用具
  • すごろくのコマ(シャーペンのキャップなど)
  • 調べたい年月日(YYYY年㎜月dd日)

方法概要

  1. カレンダーで今年の調べたい日付の曜日を確認
  2. うるう年を無視して曜日を計算
  3. うるう年を加味して計算結果を修正

具体的な方法

1.カレンダーで今年の調べたい日付の曜日を確認

以下のような表を書く
image.png

調べたい日付の今年の曜日にコマを置く
ex.
調べたい日付が1992年7月19日、
今年が2019年なら
金曜日(2019年7月19日は金曜日)にコマを置く
image.png

2.うるう年を無視して曜日を計算

(今年(yyyy) - 調べたい年(YYYY)) % 7
("%"は割り算の余りを求めるという意味)
の分、コマを左に進める(もし日曜日まで行ったら、次は土曜日に進める)
ex.先の例の場合
(2019 - 1992) % 7 = 6
より以下のようになる。
image.png

image.png

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

よって
image.png
となる。
最後にコマのある位置が求めたい曜日になるので、夏希先輩の生まれた日は日曜日であることが分かる。
ちなみに2月29日の曜日を求める場合、2月28日を求めて最後に右に1つコマを進めればできます。

結論

モジュロ演算を知らなくても"簡単に"曜日を求められる。
会話しながら求めるにはやはり、頭の中にGPUが必要。

最後に

サマーウォーズ10周年イベントを楽しみましょう!!

参考文献

サマーにウォーズをするための一歩を踏み出す
サマーウォーズ公式サイト
Guide Map サマーウォーズロケ地ガイド

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?