LoginSignup
6
3

More than 5 years have passed since last update.

サマーにウォーズをするための一歩を踏み出す

Last updated at Posted at 2018-12-21

はじめに

この記事はLife is Tech! Tokai Mentors Advent Calendar 2018の22日目の記事です。

クリスマスまであと残すところ3日となりましたね。みなさんクリスマスの予定はありますか?

今回は、目先のクリスマスに囚われるのではなく、来年の夏をエンジョイするための技術を手に入れるための記事です。
(アドベントカレンダーの趣旨をガン無視しているようですがご容赦ください...)

夏をエンジョイするには?

夏といえば恋と絆とプログラミングですよね!!

そんな魅力がすべて詰まった神映画が、みなさんご存知スタジオ地図によるサマーウォーズです!

summer.jpg

サマーウォーズは、

ある日、佐久間と共にOZの保守点検のバイトをしていた高校2年生の健二は、憧れの先輩である夏希から、一緒に夏希の実家に行くという「バイト」に誘われる。実家には夏希の曽祖母である栄おばあちゃんの90歳の誕生日を祝うために、26人の親族が一堂に集まり、健二はひょんなことから栄のために「夏希の婚約者のふり」をすることになった。(Wikipedia-サマーウォーズ)

というところから物語が始まっていきます。

サマーウォーズのように夏休みに田舎に行って大家族の絆を感じたり、天才プログラマーの侘助に会ったり、夏希先輩と恋がしたかったと思っている読者の皆様はきっと多いはず。

そのためにまず第一段階として健二のような数学力を身に着ける...と言いたいところですが流石に数学オリンピックレベルまで登りつめるのは容易ではないでしょう。

幸いにも我々はプログラミングという別の力を持っていますので、存分にその力を発揮しましょう。

今回は健二が冒頭で 夏希先輩の誕生日から曜日を計算して見せたシーンを再現することでホットな夏を過ごすための第一歩を踏み出したいと思います。

日付から何曜日かを計算する

datetimeを使う方法

python3にはdatetimeというモジュールがあるので、それを使ってやれば一発で曜日を求めることができます。

# coding:utf-8
import sys
from datetime import *
from time import *


def main():
    print('先輩の誕生日いつですか?')
    year = input('年:')
    month = input('月:')
    day = input('日:')

    week = ['月','火','水','木','金','土','日']

    input_date = year + '/' + month + '/' + day
    date = datetime.strptime(input_date,'%Y/%m/%d')
    print(week[date.weekday()]+'曜日です。')
    print(str(year) +'年'+str(month) + '月'+ str(day) +'日は'+ str(week[date.weekday()])+'曜日でした。')


if __name__ == '__main__':
    main()

実行結果は次のようになり、映画のあのシーンも再現できてしまいます。

とはいいつつも本当に会っているのかが分かりにくいので今日の日付もテストしておきました。
スクリーンショット 2018-12-22 0.59.43.png

モジュロ計算を行う方法(ツェラーの公式)

モジュールを使えば簡単に曜日が求められるのは分かりましたが、あまりにも簡単すぎてなんだか味気ないですね。

ということで入力された日付から曜日を計算で求めるためのツェラーの公式を使ってみます。

作中で健二が使ったのもおそらくこの方法です。

公式の内容が気になる方は上記リンクから確認してください。

# coding:utf-8
from decimal import *

if __name__ == '__main__':
    print('先輩の誕生日いつですか?')
    year = int(input('年:'))
    month = int(input('月:'))
    day = int(input('日:'))

    if month <= 2:
        month = month + 12

    year = str(year - 1)
    C = Decimal(int(year[0:2]))
    Y = Decimal(int(year)%100)
    F = day + (26*(month+1)/10) + int(Y) + (int(Y)/4) - 2*int(C) + (int(C)/4)
    X = (F % 7)
    week = ['土','日','月','火','水','木','金']
    print(week[int(X)]+'曜日です')
    print(str(year) +'年'+str(month) + '月'+ str(day) +'日は'+ str(week[int(X)])+'曜日でした。')

スクリーンショット 2018-12-22 1.19.04.png
こちらも結果は合っているようです。

結果は同じですがコードを見るとツェラーの公式を使った方がなんとなくいい感じですね。

まとめ

僕も高校生の時に夏希先輩と知り合いたかったなぁ...。

というか今すぐ侘助になりたいです。いろんな意味で。

最後まで読んでくださったそこのあなた

いいねを

「よろしくお願いしまぁぁぁぁぁぁぁぁぁぁぁぁぁす!!!!!!」
yorosiku.jpg

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3