En un esfuerzo por nivelar el campo de juego entre los idiomas con bibliotecas de fechas incorporadas y las que no tienen, trabajemos con un calendario ficticio. Los Reinos Olvidados son una ( ¿la? ) Configuración de campaña para Dungeons & Dragons. Por supuesto, cada uno tiene su propio calendario.
El calendario de harptos
Convenientemente, un año en Forgotten Realms también tiene 365 días. Además, el calendario también tiene 12 meses. Sin embargo, aquí es donde se pone interesante. Cada mes dura exactamente 30 días. Los 5 días restantes son días festivos que caen entre los meses. Estos son los meses y días festivos en orden (con días festivos sangrados):
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
Tenga en cuenta que he insertado un sexto día festivo entre paréntesis. Este es el día bisiesto que solo ocurre cada cuatro años (sí, eso es todo, no hay travesuras adicionales con los siglos).
Nota al margen sobre los nombres de los meses: cada mes tiene un nombre formal y uno común. Los anteriores son los nombres comunes. Los elegí porque creo que permiten una compresión más interesante.
Hay varias numeraciones de los años, pero la más extendida es Dalereckoning , abreviada a DR . (Además, cada año tiene uno o más nombres , pero no nos vamos a molestar con eso).
Los componentes de una fecha deben estar separados por una coma y un espacio. Con todo, una fecha válida podría verse así:
4, The Melting, 1491 DR
o
Shieldmeet, 1464 DR
Tenga en cuenta que no hay un número de día para las vacaciones. (Supongo 4th of The Melting
que sería mejor para los días de los meses, pero no quiero arrastrar números ordinales a esto).
Nota al pie: Se me ocurrió esto cuando xnor se quejó de que cada desafío de fecha necesita el cálculo del año bisiesto. He fallado en eliminarlo por completo, pero al menos es solo un módulo en este calendario.
El reto
Dada una fecha válida del Calendario de Harptos, así como un número entero D
, muestra la fecha D
días después. Tenga en cuenta que D
puede ser negativo, en cuyo caso debe devolver la fecha D
días antes.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
Puede suponer que el año es positivo y menos de 2000.
Aplican reglas estándar de código de golf .
Casos de prueba
La primera docena de casos de prueba deberían probar todos los casos límite que rodean las vacaciones y los años bisiestos. El siguiente conjunto es para probar que abarca varios años de trabajo y todos los meses y días festivos se han implementado. La segunda mitad son todos los mismos casos de prueba nuevamente pero con compensaciones 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"
fuente
Respuestas:
Ruby,
543523521498511509 bytesPara alentar más respuestas a esta pregunta, voy a publicar una versión Ruby de mi respuesta de Python, ya que pensé que sería más corta. Esta respuesta es más corta pero no mucho. ¿ Puedes hacerlo mejor?
Editar: Gracias a Martin Büttner y su sugerencia aquí .
Editar: Golfé la lista de "número de días en un mes" considerablemente abajo.
Editar: Si bien jugar al golf por la forma en que manejé
d[10]=r%4<1?1:0
ad[10]=0**(r%4)
un byte, me di cuenta de que había introducido un error mientras golf abajod
, el número de la lista de días, por lo que tuvo del Escudo 30 días por accidente. Y así, el recuento de bytes ha vuelto a subir. También editaré la respuesta de Python para corregir este error allí.Editar: Olvidé que las funciones no necesitan ser nombradas en esta pregunta.
Sin golf:
fuente
Python 3,
712652636567563552550548529540 bytesPor fin, encontré tiempo para escribir una respuesta a esta excelente pregunta. Todavía no es muy interesante (la lista de nombres de meses
y la cantidad de díases particularmente notoria en este caso, y el hecho de que el manejo negativo), pero al menos es una respuesta.D
requiere un ciclo while separadoEditar: arreglando un error
Sin golf:
fuente