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.
O suporte nativo do Prolog para datas é bastante rudimentar. Uma forma bem mais agradável de trabalhar com datas é usar o [pacote date_time][date_time-package].
Se a versão do Swipl que você instalou estiver razoavelmente atualizada, você pode instalar o pacote rodando:
swipl pack install date_time
Se isso não funcionar, você pode rodar:
swipl -g 'pack_install(date_time)'
Se você estiver usando o editor online, não precisa instalar nada manualmente.
Adicione o seguinte código no topo do arquivo da sua solução para usar o pacote date_time:
:- use_module(library(date_time)).
Dica: o [código-fonte do pacote date_time][https://www.swi-prolog.org/pack/file_details/date_time/prolog/date_time.pl?show=src] é bem documentado e pode ser de grande ajuda!
Crie sua conta no Exercism para aprender e dominar Prolog com 109 exercícios e mentoria humana de verdade, tudo de graça.