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


投稿日 2019年6月24日 >> 更新日 2023年3月2日

今回はグレゴリオ暦を入力すると、うるう年かそうでは無いかといった出力をするプログラムに挑戦したので紹介していこうと思います。

というのも、paizaのプログラミングスキルチェック初級編を行い4時間も掛かってしまったので反省と復習を込めて書いていきます。

初級編で4時間.... 会社でいうならば就業時間の半分も使ってこんな単純なプログラムを書いているようじゃきっと他では雇ってもらえない。

まあそんなことは気にせず前向きに生きましょう。

ちなみにこのプログラミングスキルチェックはプログラミング言語問わず行えるので、ぜひ挑戦してみましょう。

実行環境

実行環境
Windows Subsystem for Linux
Python 3.6.8

うるう年判定の条件

条件としては

  • 1、西暦が4で割り切れる年は閏年。
  • 2、ただし、100で割り切れる年は閏年ではない。
  • 3、ただし、400で割り切れる年は閏年。

期待する出力

  • 標準出力(stdout)で、入力された行数分の判定結果を出力します。
  • うるう年だった場合[N is a leap year]
  • うるう年でない場合[N is not a leap year] と、出力。

入力例

  • 1000
  • 1992
  • 2000
  • 2001

出力例

  • 1000 is not a leap year
  • 1992 is a leap year
  • 2000 is a leap year
  • 2001 is not a leap year

これらの条件は本家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文で何とか回避できた。

問題を解くことは楽しいがいざ仕事となると納期だったりチームの協調性なども読まなければいけないのでエンジニアの「楽しい」と「辛い」、「趣味」と「仕事」はトレードオフの関係にありそうだと少し思いました。

でも苦労して出来上がったプログラムは自分の誇りでもあるのでマクロ的にはそんなの関係無いですね。

どんどん挑戦していきましょう!

それでは以上になります。

最後までご覧いただきありがとうございます。