グレゴリオ暦でうるう年を判定するプログラムに挑戦

今回はグレゴリオ暦を入力すると、うるう年かそうでは無いかといった出力をするプログラムに挑戦したので紹介していこうと思います。
というのも、paizaのプログラミングスキルチェック初級編を行い4時間も掛かってしまったので反省と復習を込めて書いていきます。
初級編で4時間.... 会社でいうならば就業時間の半分も使ってこんな単純なプログラムを書いているようじゃきっと他では雇ってもらえない。
まあそんなことは気にせず前向きに生きましょう。
ちなみにこのプログラミングスキルチェックはプログラミング言語問わず行えるので、ぜひ挑戦してみましょう。
| 実行環境 | 
|---|
| Windows Subsystem for Linux | 
| Python 3.6.8 | 
条件としては
期待する出力
入力例
出力例
これらの条件は本家paizaチェックとは少し異なりますが要件と結果が分かれば何となくイメージが湧くと思います。
成功例ではあるけれどpaizaさんのスキルチェックに渡したわけでは無いのでコーディング的には間違っているかもしれない。
しかし結果を出せた事に関しては変わらないので4時間の集大成を紹介したいと思います。
まず入力例であるグレゴリオ暦をlistとして変数Nに代入しそれをfor文で回しながらif文による条件分岐させるといったよくありそうで思いつきそうなプログラムを書いた。
number = [1000, 1992, 2000, 2001]
for i in number:
    t1 = i / 4
    if t1 == int(t1):
        t2 = i / 100
        if t2 == int(t2):
            t3 = i / 400
            if t3 == int(t3):
                print('{} is a leap year'.format(i))
            else:
                print('{} is not a leap year'.format(i))
        else:
            print('{} is a leap year'.format(i))
    else:
        print('{} is not a leap year'.format(i))
結果はこのようになる
1000 is not a leap year
1992 is a leap year
2000 is a leap yser
2001 is not a leap year
さらにグレゴリオ暦をいちいちスクリプトに打ち込んで実行するのは面倒なのでinput()関数を使ったループ処理で実行を試みた。
実行後CUIにてグレゴリオ暦を渡したらis a leap yearかis not a leap yearか、qを渡したら終了というプログラム。
while True:
    value = input('year [q to quit]: ')
    if value == 'q':
        break
    number = int(value)
    t1 = number / 4
    if t1 == int(t1):
        t2 = number / 100
        if t2 == int(t2):
            t3 = number / 400
            if t3 == int(t3):
                print('{} is a leap year'.format(number))
            else:
                print('{} is not a leap year'.format(number))
        else:
            print('{} is a leap year'.format(number))
    else:
        print('{} is not a leap year'.format(number))
実行結果
year [q to quit]: 1000
1000 is not a leap year
year [q to quit]: 1992
1992 is a leap year
year [q to quit]: 2000
2000 is a leap year
year [q to quit]: 2001
2001 is not a leap year
year [q to quit]: 2002
2002 is not a leap year
year [q to quit]: 2008
2008 is a leap year
year [q to quit]: 2012
2012 is a leap year
year [q to quit]: q ←終了
条件判定をしっかり見ないまま、「4で割り切れる西暦はうるう年」だと高をくくり実行した結果。
number = [1000, 1992, 2000, 2001]
for i in number:
    t1 = i / 4
    if t1 == int(t1):
        print('{} is a leap year'.format(i))
    else:
        print('{} is not a leap year'.format(i))
結果
1000 is a leap year
1992 is a leap year
2000 is a leap year
2001 is not a leap year
例外として、西暦年号が100で割り切れて400で割り切れない年は平年とする。という事なので西暦1000年は平年でないといけない。
ここから4時間知恵を絞りに絞って雑なif文で何とか回避できた。
問題を解くことは楽しいがいざ仕事となると納期だったりチームの協調性なども読まなければいけないのでエンジニアの「楽しい」と「辛い」、「趣味」と「仕事」はトレードオフの関係にありそうだと少し思いました。
でも苦労して出来上がったプログラムは自分の誇りでもあるのでマクロ的にはそんなの関係無いですね。
どんどん挑戦していきましょう!
それでは以上になります。
最後までご覧いただきありがとうございます。