Help us understand the problem. What is going on with this article?

Project Euler 19

More than 5 years have passed since last update.

問題

次の情報が与えられている.

1900年1月1日は月曜日である.
9月, 4月, 6月, 11月は30日まであり, 2月を除く他の月は31日まである.
2月は28日まであるが, うるう年のときは29日である.
うるう年は西暦が4で割り切れる年に起こる. しかし, 西暦が400で割り切れず100で割り切れる年はうるう年でない.
20世紀(1901年1月1日から2000年12月31日)中に月の初めが日曜日になるのは何回あるか?
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2019

回答

日曜:0 月曜:1 火曜:2 水曜:3 木曜:4 金曜:5 土曜:6
とする。
前月の1日の曜日dateと前月の日数daysから次の式により次月の1日の曜日nextdateは算出できる。(7は曜日数)。これを利用して以下のコードを書いた。

nextdate = (date+days) % 7
# -*- coding: utf-8 -*-
def getdays(month, year):
  if month in [1,3,5,7,8,10,12]:
    return 31
  elif month in [4,6,9,11]:
    return 30
  elif year%400 == 0:
    return 29
  elif year%100 == 0:
    return 28
  elif year%4 == 0:
    return 29
  else:
    return 28

def nextdate(date, month, year):
   return (date + getdays(month, year)) % 7

def nextmonth(month, year):
   if month == 12:
      #12月であれば次の年へ
      return (1, year+1)
   else:
      return (month+1, year)

def main():
  STARTYEAR = 1901
  LASTYEAR = 2000
  (date, month, year) = (1, 1, 1900)
  ans = 0

  while year <= LASTYEAR:

    #前月のdate,month,yearから次月のdate(曜日)を取得
    date = nextdate(date, month, year)

    #month, yearをインクリメント
    (month,year) = nextmonth(month, year)

    #yearが範囲内でdateが0(日曜日)ならansに1を加える。
    if STARTYEAR <= year <= LASTYEAR and date == 0:
      ans += 1

  print ans

main()
cof
特許弁理士です。仕事ではプログラムを書いていませんが、日曜プログラマになれるよう、Project Eulerでもやりながら研鑽していこうかと考えています。 pythonを学習中です。いろいろご指摘いただけますと幸いです。
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