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"
fonte
Respostas:
Ruby,
543523521498511509 bytesPara incentivar mais respostas a essa pergunta, vou postar uma versão Ruby da minha resposta em Python, pois achei que seria mais curta. Essa resposta é mais curta, mas não muito. Você pode fazer melhor?
Edit: Com agradecimentos a Martin Büttner e sua sugestão aqui .
Edit: Eu joguei a lista de "número de dias em um mês" consideravelmente.
Edit: Enquanto jogava golfe como lidei
d[10]=r%4<1?1:0
comd[10]=0**(r%4)
um byte, notei que havia introduzido um bug enquantod
jogava golfe , a lista de número de dias, para que o Shieldmeet tivesse 30 dias por acidente. E assim, a contagem de bytes voltou. Também editarei a resposta do Python para corrigir esse bug.Edit: Eu esqueci que as funções não precisam ser nomeadas nesta pergunta.
Ungolfed:
fonte
Python 3,
712652636567563552550548529540 bytesFinalmente, encontrei tempo para escrever uma resposta para esta excelente pergunta. Ainda não é muito disputado (a lista de nomes de meses
e o número de dias sãoparticularmente notórios nesse caso, e o fato de lidar com negativos), mas pelo menos é uma resposta.D
requer um loop while separadoEditar: corrigindo um bug
Ungolfed:
fonte