From d2bae2acd588e64bc61703387f70347a19464f97 Mon Sep 17 00:00:00 2001 From: Julien Lengrand-Lambert Date: Thu, 26 Jan 2012 16:51:42 +0100 Subject: [PATCH] Solves Problem 19. Some code coming from the internet has been put in utils. Solution was not used, but seems more elegant. Signed-off-by: Julien Lengrand-Lambert --- e_19.py | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 141 insertions(+), 7 deletions(-) diff --git a/e_19.py b/e_19.py index 13f5a06..2dc48cb 100755 --- a/e_19.py +++ b/e_19.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python """ ##--- # jlengrand @@ -18,11 +18,145 @@ How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)? ##--- """ -def first_sundays(): +class Date: """ - """ - - return 1 + Date object. + Should be initiated with a given year, month and day. + Designed to output the value of the day for a given date. -if __name__ == '__main__': - print "Answer : %d" % (first_sundays()) + Should not be used for dates before 1 Jan 1900 + Month : 1 to 12, should be an int + Day : 1 to 31, should be an int + """ + def __init__(self, year, month, day): + """ + Only values needed are day, month and year + """ + self.year = year + self.month = month + self.day = day + + def days_in_month(self): + """ + Calculates the number of days in the current month + """ + if self.month in [4, 6, 9, 11]: + return 30 + elif self.month is 2: + if self.is_leap_year(): + return 29 + else: + return 28 + else: + return 31 + + def _is_end_year(self): + """ + Checks whether this is the end of the current year. + Simply checks if we are the 31 December + """ + if (self.month == 12) and (self.day == 31): + return True + else: + return False + + def is_leap_year(self): + """ + Returns true or false depending if this year is a leap year or not. + """ + if self.year % 100 == 0: # we are i a century + if self.year % 400 == 0: #special century + return True + else: + return False + elif self.year % 4 == 0: # evenly divisible by 4 + return True + else: + return False + + def add_day(self): + """ + Adds one day to the current Date. + """ + if ((self.day + 1) > self.days_in_month()): + self.day = 1 + if (self.month + 1) > 12: + self.month = 1 + self.year += 1 + else: + self.month += 1 + else: + self.day += 1 + + def __repr__(self): + """ + Nice display for Date Object + """ + return "%d/%d/%d" % (self.day, self.month, self.year) + + def __eq__(self, other_date): + """ + Allows to check if two dates are the same day + """ + if (self.day == other_date.day) and (self.month == other_date.month) and (self.year == other_date.year): + return True + else: + return False + +def ptr_from_start(start_date): + """ + Returns the pointer of day for start_date + """ + #global ref_date + #global ref_day + #global days + ref_date = Date(1900, 1, 1) + ref_day = "monday" + days = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"] + + day_ptr = days.index(ref_day) # We start from the reference + temp_date = ref_date # We suppose the reference is anterior to start_date + + while not(temp_date == start_date): + temp_date.add_day() + curr_day = days[day_ptr] + day_ptr = (day_ptr + 1 ) % len(days) + + return day_ptr + +def days_in_period(string_day, nbr_day, start_date, end_date): + """ + Returns the number of string_day that are the nbr_day of the month between + start_date and end_date + + WARNING : No checks are made in any way ! Reference is ugly + """ + #global ref_date + #global ref_day + #global days + ref_date = Date(1900, 1, 1) + ref_day = "monday" + days = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"] + + day_ptr = ptr_from_start(start_date) + + curr_date = start_date + end_ptr = 0 + + while not (curr_date == end_date): + curr_day = days[day_ptr] + + if (curr_day == string_day) and (curr_date.day == nbr_day): + end_ptr += 1 + + day_ptr = (day_ptr + 1 ) % len(days) + curr_date.add_day() + + return end_ptr + +if __name__ == '__main__' : + days = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"] + start_date = Date(1901, 1, 1) + end_date = Date(2000, 12, 31) + print "Answer is : %d" %(days_in_period("sunday", 1, start_date, end_date)) + raw_input() # USed to keep Windows terminal open