Counting Sundays
You are given the following information, but you may prefer to do some research for yourself.
- 1 Jan 1900 was a Monday.
- Thirty days has September,
April, June and November.
All the rest have thirty-one,
Saving February alone,
Which has twenty-eight, rain or shine.
And on leap years, twenty-nine. - A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.
To solve this problem I have used inbuilt calendar module.
I will first explain some code before we will solve the problem.
Calendar module is a inbuilt module in python with which you can perform all the calculations related to days, year, months etc.
In calendar module days(days of week) are represented in number format.
They are as follows:
0 - Monday
1 - Tuesday
2 - Wednesday
3 - Thursday
4 - Friday
5 - Saturday
6 - Sunday
This module by default assumes that the week starts with Monday.To use calendar module, you first have to import it.
>>> import calendar >>>
To change the start of week from Monday to Sunday we do as follows:
>>> calendar.setfirstweekday(6)#6-Sunday >>>
To check the first week day:
>>> calendar.firstweekday() 6 >>>
To print calendar for a year:
>>> calendar.prcal(2016)
The output will be as follows:
2016 calendar generated using python |
Printing calender for a specified month:
>>> calendar.prmonth(2016,4)
Output will look something like this:
April 2016 Calendar generated using python |
Till now we have seen the calenders in a neat human readable format. But for our computation these are not useful, we will have to use matrices. To generate a months calender in a matrix form then(For April 2016):
>>> calendar.monthcalendar(2016,4)
Matrix generated by above code will be as follows:
[[0, 0, 0, 0, 0, 1, 2], [3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30]]
Consider the first list in the list generated above. If we write the above in a human readable calendar format then it will look something like this:
April | ||||||
---|---|---|---|---|---|---|
Su | Mo | Tu | We | Th | Fr | Sa |
0 | 0 | 0 | 0 | 0 | 1 | 2 |
As you have seen, if in the first list the first number(index 0) is 1 then the month has started with Sunday.
This is the concept behind our program. This may look complicated but is very simple. Try to understand it. If you haven't understood it then read this post again or you can see the official documentation.
Program
Program using the above concept is as follows:
It will be very simple once you have understood the above concept or algorithm whatever you call it.
You can download the above program from Github Gist pep19.py.
Output
Summary
I think this problem is easy if you knew calendar module. Once I understood the calender module, it just took me a few minutes to solve this problem.
I have not explained any code because the code is well commented and also it is easy once you understand the concept behind it. If you haven't understood anything comment in the comment box below and I will be glad to help you.
Please don't hesitate to comment if you have found any typo or have a different/better code.
You can also contact me .
Thank you. Have a nice day.