[PYTHON] Project Euler 19

problem

The following information is given.

January 1, 1900 is Monday. September, April, June, and November have up to 30 days, and all months except February have up to 31 days. February has 28 days, but in leap years it is 29 days. A leap year occurs in a year when the Christian era is divisible by 4. However, a year when the Christian era is not divisible by 400 and divisible by 100 is not a leap year. How often does the beginning of the month be Sunday during the 20th century (January 1, 1901-December 31, 2000)? http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2019

Answer

Sunday: 0 Monday: 1 Tuesday: 2 Wednesday: 3 Thursday: 4 Friday: 5 Saturday: 6 And. The next date of the first day of the next month can be calculated from the day of the week date of the first day of the previous month and the number of days of the previous month by the following formula. (7 is the number of days of the week). Using this, I wrote the following code.

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:
      #December to the next year
      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:

    #Last month date,month,year to next month date(Day of the week)Get
    date = nextdate(date, month, year)

    #month,Increment year
    (month,year) = nextmonth(month, year)

    #year is in range and date is 0(Sunday)Then add 1 to ans.
    if STARTYEAR <= year <= LASTYEAR and date == 0:
      ans += 1

  print ans

main()

Recommended Posts

Project Euler 37
Project Euler 7
Project Euler 47
Project Euler 31
Project Euler 4
Project Euler 38
Project Euler 17
Project Euler 26
Project Euler 8
Project Euler 23
Project Euler 22
Project Euler 19
Project Euler 50
Project Euler 42
Project Euler 33
Project Euler 32
Project Euler 43
Project Euler 35
Project Euler 36
Project Euler 24
Project Euler 46
Project Euler 48
Project Euler 45
Project Euler 6
Project Euler 44
Project Euler 39
Project Euler 40
Project Euler 49
Project Euler 29
Project Euler 27
Project Euler 41
Project Euler 18
Project Euler 13
Project Euler 30
Project Euler 16
Project Euler 14
Project Euler 34
Project Euler 25
[Project Euler] problem1
Project Euler15 "Lattice Path"
Project Euler 2 Acceleration 2.21 Save microseconds.
Project Euler Original Method Group 1
What is Project Euler 3 Acceleration?
Functional programming in Python Project Euler 1
Project Euler 10 "Sum of Prime Numbers"
[Note] Project Euler in Python (Problem 1-22)
Project Euler # 5 "Minimum Multiples" in Python
Project Euler 4 Attempt to speed up
Functional programming in Python Project Euler 2
Project Euler 11 "Maximum product in grid"
Project Euler # 15 "Lattice Path" in Python
Project Euler # 4 "Maximum Palindrome" in Python
Project Euler 9 Retention of calculation results
Project Euler # 3 "Maximum Prime Factors" in Python
Project Euler # 11 "Maximum Product in Grid" in Python
Project Euler # 7 "1000 1st prime number" in Python
Project Euler # 16 "Sum of Powers" in Python
Project Euler # 9 "Special Pythagorean Triple" in Python
Project Euler # 14 "Longest Collatz Sequence" in Python
I wrote Project Euler 1 in one liner.
Project Euler # 2 "Even Fibonacci Numbers" in Python