mirror of
https://github.com/Xevion/exercism.git
synced 2025-12-06 03:15:01 -06:00
39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
import datetime, pprint, calendar
|
|
|
|
ordinal_meaning = {
|
|
'first' : 0,
|
|
'second' : 1,
|
|
'third' : 2,
|
|
'fourth' : 3,
|
|
'fifth' : 4,
|
|
'last' : -1
|
|
}
|
|
|
|
weekday_meaning = {
|
|
'monday' : 0,
|
|
'tuesday' : 1,
|
|
'wednesday' : 2,
|
|
'thursday' : 3,
|
|
'friday' : 4,
|
|
'saturday' : 5,
|
|
'sunday' : 6
|
|
}
|
|
|
|
class MeetupDayException(Exception):
|
|
def __init__(self, expression, message):
|
|
self.expression, self.message = expression, message
|
|
|
|
def meetup(year, month, week, day_of_week):
|
|
# Get all days in a month
|
|
days = [datetime.date(year, month, day) for day in range(1, calendar.monthrange(year, month)[1] + 1)]
|
|
# Filter to the day of week being targeted
|
|
days = [date for date in days if date.weekday() == weekday_meaning[day_of_week.lower()]]
|
|
if week in ordinal_meaning.keys():
|
|
return days[ordinal_meaning[week]]
|
|
elif week == 'teenth':
|
|
return [date for date in days if date.day <= 19 and date.day >= 13][0]
|
|
else:
|
|
try:
|
|
return days[int(week[0]) - 1]
|
|
except IndexError as err:
|
|
raise MeetupDayException(err, "Invalid date parameter \'{}\'".format(week)) |