Cada mes, tu pareja se reúne con su mejor amigo. Ambos tienen agendas muy ocupadas, ¡así que encontrar una fecha que les sirva es todo un reto! Como tú también tienes una agenda ocupada, tu pareja siempre consulta contigo las posibles fechas para reunirse:
En la llamada de este mes, tu pareja te preguntó lo siguiente:
Sin entender nada, le preguntas qué es un día «teenth». Tu pareja te explica que un día «teenth», un concepto que se inventó, se refiere a los días del mes que terminan en «-teenth»:
Como además hay siete días de la semana, está garantizado que cada día de la semana tiene exactamente un día «teenth» cada mes.
Ahora que entiendes el concepto de día «teenth», revisas tu calendario. No tienes nada planeado para el teenth jueves, así que confirmas la fecha con tu pareja sin dudarlo.
Tu tarea es encontrar la fecha exacta de una reunión, dado un mes, un año, un día de la semana y una semana.
Hay seis valores de semana que debes considerar: first, second, third, fourth, last, teenth.
Por ejemplo, es posible que te pidan encontrar la fecha de la reunión del primer lunes de enero de 2018 (1 de enero de 2018).
De manera similar, es posible que te pidan encontrar:
La semana teenth se refiere a los siete días de un mes que terminan en «-teenth» (13th, 14th, 15th, 16th, 17th, 18th y 19th).
Si te piden encontrar el sábado teenth de agosto de 1953, consultamos su calendario:
August 1953
Su Mo Tu We Th Fr Sa
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 31
A partir de esto, encontramos que el sábado teenth es el 15 de agosto de 1953.
Agregamos un descriptor de semana adicional (fifth) para el quinto día de la semana del mes, si lo hay.
Si no hay un quinto día de la semana en un mes, debes lanzar una excepción.
A veces es necesario tanto personalizar como raise excepciones en tu código. Cuando haces esto, siempre debes incluir un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda mucho con la depuración.
Las excepciones personalizadas se pueden crear a través de nuevas clases de excepción (consulta classes para más detalle), que por lo general son subclases de Exception.
En situaciones donde sabes que el origen del error será una derivada de cierto tipo de excepción, puedes optar por heredar de uno de los built in error types bajo la clase Exception. Al lanzar el error, igualmente debes incluir un mensaje significativo.
Este ejercicio en particular requiere que crees una excepción personalizada que se lance/«arroje» cuando a tu función meetup() se le dé una combinación de nombre de día de la semana y número que no sea válida. Las pruebas solo pasarán si personalizas las excepciones adecuadas, raise esas excepciones e incluyes mensajes de error apropiados.
Para personalizar una built-in exception, crea una class que herede de esa excepción. Al lanzar la excepción personalizada con un mensaje, escribe el mensaje como argumento del tipo exception:
# subclassing the built-in ValueError to create MeetupDayException
class MeetupDayException(ValueError):
"""Exception raised when the Meetup weekday and count do not result in a valid date.
message: explanation of the error.
"""
def __init__(self, message):
self.message = message
# raising a MeetupDayException
raise MeetupDayException("That day does not exist.")
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.