Todos os meses, a tua cara-metade encontra-se com o melhor amigo. Ambos têm agendas muito preenchidas, o que torna difícil encontrar uma data que sirva! Como também tens a tua própria agenda preenchida, a tua cara-metade confirma sempre duas vezes contigo as potenciais datas dos encontros:
Na chamada deste mês, a tua cara-metade fez-te esta pergunta:
Confuso, perguntas o que é um dia "teenth". A tua cara-metade explica que um dia teenth, um conceito que inventou, se refere aos dias do mês que acabam em '-teenth':
Como também há sete dias da semana, é garantido que cada dia da semana tem exatamente um dia teenth por mês.
Agora que compreendes o conceito de dia teenth, consultas o teu calendário. Não tens nada planeado para a quinta-feira teenth, por isso confirmas a data com a tua cara-metade, todo contente.
A tua tarefa é encontrar a data exata de um encontro, dados 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, podes ter de encontrar a data do encontro na primeira segunda-feira de janeiro de 2018 (1 de janeiro de 2018).
Da mesma forma, podes ter de encontrar:
A semana teenth refere-se aos sete dias de um mês que terminam em '-teenth' (13, 14, 15, 16, 17, 18 e 19).
Se te pedirem para encontrar o sábado teenth de agosto de 1953, consultamos o calendário desse mês:
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 daqui, concluímos que o sábado teenth é 15 de agosto de 1953.
O suporte incorporado do Prolog para datas é razoavelmente rudimentar. Uma forma muito mais agradável de trabalhar com datas é através do [pacote date_time][date_time-package].
Se a tua versão instalada do Swipl for bastante recente, podes instalar o pacote com o seguinte comando:
swipl pack install date_time
Se isso não funcionar, podes executar:
swipl -g 'pack_install(date_time)'
Se estás a usar o editor online, não precisas de instalar nada manualmente.
Adiciona o seguinte código ao topo do teu ficheiro de solução para usares 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] está bem documentado e pode ser uma grande ajuda!
Inscreve-te no Exercism para aprenderes e dominares Prolog com 109 exercícios, e mentoria humana real, tudo grátis.