Todo mês, seu parceiro se encontra com o melhor amigo dele. Os dois têm agendas muito cheias, o que torna difícil encontrar uma data que funcione! Como você também tem uma agenda cheia, seu parceiro sempre confirma com você as possíveis datas do encontro:
Na ligação deste mês, seu parceiro te fez esta pergunta:
Sem entender, você pergunta o que é um dia "teenth". Seu parceiro explica que um dia "teenth", um conceito que ele inventou, refere-se aos dias do mês que terminam em '-teenth':
Como também há sete dias da semana, é garantido que cada dia da semana tenha exatamente um dia "teenth" por mês.
Agora que você entende o conceito de dia "teenth", confere seu calendário. Você não tem nada planejado para a quinta-feira "teenth", então confirma a data com seu parceiro alegremente.
Sua tarefa é encontrar a data exata de um encontro, dado um mês, um ano, um dia da semana e uma semana.
Há seis valores de semana a considerar: first, second, third, fourth, last, teenth.
Por exemplo, pode ser que você precise encontrar a data do encontro na primeira segunda-feira de janeiro de 2018 (1º de janeiro de 2018).
Da mesma forma, pode ser que você precise encontrar:
A semana teenth se refere aos sete dias de um mês que terminam em '-teenth' (13th, 14th, 15th, 16th, 17th, 18th e 19th).
Se pedirem para encontrar o sábado teenth de agosto de 1953, consultamos o calendário:
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
Com isso, vemos que o sábado teenth é 15 de agosto de 1953.
Adicionamos um descritor de semana extra (fifth) para o quinto dia da semana do mês, caso ele exista.
Se não houver um quinto dia da semana em um mês, você deve lançar uma exceção.
Às vezes é necessário tanto personalizar quanto raise exceções no seu código. Quando você fizer isso, sempre inclua uma mensagem de erro significativa que indique qual é a origem do erro. Isso deixa seu código mais legível e ajuda bastante a depurar.
Exceções personalizadas podem ser criadas por meio de novas classes de exceção (veja classes para mais detalhes.) que normalmente são subclasses de Exception.
Para situações em que você sabe que a origem do erro será derivada de um determinado tipo de exceção, você pode escolher herdar de um dos built in error types sob a classe Exception. Ao lançar o erro, você ainda deve incluir uma mensagem significativa.
Este exercício em particular exige que você crie uma exceção personalizada para ser lançada/"disparada" quando sua função meetup() receber uma combinação inválida de nome de dia da semana e número. Os testes só passarão se você personalizar as exceções adequadas, lançá-las com raise e incluir mensagens de erro adequadas.
Para personalizar uma built-in exception, crie uma class que herde dessa exceção. Ao lançar a exceção personalizada com uma mensagem, escreva a mensagem como argumento do 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.")
Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.