Reunión

Reunión

Intermedia

Introducción

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:

  • «¿Podemos reunirnos el first viernes del próximo mes?»
  • «¿Y el third miércoles?»
  • «¿Tal vez el last domingo?»

En la llamada de este mes, tu pareja te preguntó lo siguiente:

  • «Me gustaría reunirnos el teenth jueves; ¿te parece bien?»

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»:

  • 13th (thirteenth)
  • 14th (fourteenth)
  • 15th (fifteenth)
  • 16th (sixteenth)
  • 17th (seventeenth)
  • 18th (eighteenth)
  • 19th (nineteenth)

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.

Instrucciones

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:

  • el tercer martes de agosto de 2019 (20 de agosto de 2019)
  • el miércoles teenth de mayo de 2020 (13 de mayo de 2020)
  • el cuarto domingo de julio de 2021 (25 de julio de 2021)
  • el último jueves de noviembre de 2022 (24 de noviembre de 2022)
  • el sábado teenth de agosto de 1953 (15 de agosto de 1953)

Teenth

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.

Cómo está estructurado este ejercicio en Python

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.

Personalizar y lanzar excepciones

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.")

Fuente

Jeremy Hinegardner mencionó una reunión en Boulder que ocurre el Wednesteenth de cada mes.
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Python Exercism

¿Todo listo para empezar Reunión?

Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.