Em um esforço para nivelar o campo de jogo entre idiomas com bibliotecas de datas integradas e outras sem, vamos trabalhar com um calendário fictício. Os Reinos Esquecidos são um cenário de campanha ( o? ) Para Dungeons & Dragons. Obviamente, cada um tem seu próprio calendário.
O calendário de Harptos
Convenientemente, um ano nos Reinos Esquecidos também tem 365 dias. Além disso, o calendário também tem 12 meses. No entanto, é aqui que fica interessante. Cada mês tem exatamente 30 dias. Os 5 dias restantes são feriados que caem entre os meses. Aqui estão os meses e feriados em ordem (com feriados recuados):
1 Deepwinter
Midwinter
2 The Claw of Winter
3 The Claw of the Sunsets
4 The Claw of the Storms
Greengrass
5 The Melting
6 The Time of Flowers
7 Summertide
Midsummer
[Shieldmeet]
8 Highsun
9 The Fading
Highharvestide
10 Leaffall
11 The Rotting
The Feast of the Moon
12 The Drawing Down
Observe que eu inseri um sexto feriado entre colchetes. Este é o dia do salto que ocorre apenas a cada quatro anos (sim, é isso - não há travessuras adicionais com os séculos).
Nota lateral sobre os nomes dos meses: cada mês tem um nome formal e comum. Os nomes acima são comuns. Eu os escolhi porque acho que eles permitem uma compressão mais interessante.
Existem várias numerações dos anos, mas a mais difundida é a de Dalereckoning , abreviada para DR . (Além disso, todo ano tem um ou mais nomes , mas não vamos nos preocupar com isso.)
Os componentes de uma data devem ser separados por vírgula e espaço. Em suma, uma data válida pode se parecer com:
4, The Melting, 1491 DR
ou
Shieldmeet, 1464 DR
Observe que não há número do dia para os feriados. (Eu suponho4th of The Melting
que seria melhor para os dias dos meses, mas não quero arrastar números ordinais para isso.)
Nota de rodapé: Eu vim com isso quando a xnor reclamou que todo desafio de data precisa do cálculo do ano bissexto. Eu falhei em eliminá-lo completamente, mas pelo menos é apenas um módulo neste calendário.
O desafio
Dada uma data válida do Calendário do Harptos, bem como um número inteiro D
, imprima a data D
dias depois. Observe que D
pode ser negativo; nesse caso, você deve retornar a dataD
dias antes.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Você pode assumir que o ano é positivo e menor que 2000.
Aplicam-se as regras de código-golfe padrão .
Casos de teste
A primeira dúzia de casos de teste deve testar todos os casos extremos que envolvem feriados e anos bissextos. O próximo conjunto é testar os intervalos de vários anos de trabalho e todos os meses e feriados foram implementados. A segunda metade é todos os mesmos casos de teste novamente, mas com compensações negativas.
"30, Summertide, 1491 DR" 1 => "Midsummer, 1491 DR"
"30, Summertide, 1491 DR" 2 => "1, Highsun, 1491 DR"
"Midsummer, 1491 DR" 1 => "1, Highsun, 1491 DR"
"30, Summertide, 1492 DR" 1 => "Midsummer, 1492 DR"
"30, Summertide, 1492 DR" 2 => "Shieldmeet, 1492 DR"
"30, Summertide, 1492 DR" 3 => "1, Highsun, 1492 DR"
"Midsummer, 1492 DR" 1 => "Shieldmeet, 1492 DR"
"Midsummer, 1492 DR" 2 => "1, Highsun, 1492 DR"
"Shieldmeet, 1492 DR" 1 => "1, Highsun, 1492 DR"
"1, Highsun, 1490 DR" 365 => "1, Highsun, 1491 DR"
"1, Highsun, 1491 DR" 365 => "Shieldmeet, 1492 DR"
"Shieldmeet, 1492 DR" 365 => "Midsummer, 1493 DR"
"Midsummer, 1493 DR" 365 => "Midsummer, 1494 DR"
"Shieldmeet, 1500 DR" 365 => "Midsummer, 1501 DR"
"14, Deepwinter, 654 DR" 5069 => "The Feast of the Moon, 667 DR"
"Midwinter, 17 DR" 7897 => "15, The Fading, 38 DR"
"3, The Claw of Winter, 1000 DR" 813 => "25, The Claw of the Storms, 1002 DR"
"Greengrass, 5 DR" 26246 => "9, The Claw of the Sunsets, 77 DR"
"30, The Melting, 321 DR" 394 => "29, The Time of Flowers, 322 DR"
"17, The Time of Flowers, 867 DR" 13579 => "20, Highsun, 904 DR"
"Highharvestide, 1814 DR" 456 => "30, The Drawing Down, 1815 DR"
"23, The Rotting, 1814 DR" 3616 => "16, Leaffall, 1824 DR"
"1, Deepwinter, 1 DR" 730499 => "30, The Drawing Down, 2000 DR"
"Midsummer, 1491 DR" -1 => "30, Summertide, 1491 DR"
"1, Highsun, 1491 DR" -2 => "30, Summertide, 1491 DR"
"1, Highsun, 1491 DR" -1 => "Midsummer, 1491 DR"
"Midsummer, 1492 DR" -1 => "30, Summertide, 1492 DR"
"Shieldmeet, 1492 DR" -2 => "30, Summertide, 1492 DR"
"1, Highsun, 1492 DR" -3 => "30, Summertide, 1492 DR"
"Shieldmeet, 1492 DR" -1 => "Midsummer, 1492 DR"
"1, Highsun, 1492 DR" -2 => "Midsummer, 1492 DR"
"1, Highsun, 1492 DR" -1 => "Shieldmeet, 1492 DR"
"1, Highsun, 1491 DR" -365 => "1, Highsun, 1490 DR"
"Shieldmeet, 1492 DR" -365 => "1, Highsun, 1491 DR"
"Midsummer, 1493 DR" -365 => "Shieldmeet, 1492 DR"
"Midsummer, 1494 DR" -365 => "Midsummer, 1493 DR"
"Midsummer, 1501 DR" -365 => "Shieldmeet, 1500 DR"
"The Feast of the Moon, 667 DR" -5069 => "14, Deepwinter, 654 DR"
"15, The Fading, 38 DR" -7897 => "Midwinter, 17 DR"
"25, The Claw of the Storms, 1002 DR" -813 => "3, The Claw of Winter, 1000 DR"
"9, The Claw of the Sunsets, 77 DR" -26246 => "Greengrass, 5 DR"
"29, The Time of Flowers, 322 DR" -394 => "30, The Melting, 321 DR"
"20, Highsun, 904 DR" -13579 => "17, The Time of Flowers, 867 DR"
"30, The Drawing Down, 1815 DR" -456 => "Highharvestide, 1814 DR"
"16, Leaffall, 1824 DR" -3616 => "23, The Rotting, 1814 DR"
"30, The Drawing Down, 2000 DR" -730499 => "1, Deepwinter, 1 DR"