El año solar es de 365 días, 5 horas, 48 minutos, 45 segundos y 138 milisegundos, según este video . Con el calendario gregoriano actual, las reglas para los años bisiestos son las siguientes:
if year is divisible by 400, LEAP YEAR
else if year is divisible by 100, COMMON YEAR
else if year is divisible by 4, LEAP YEAR
else, COMMON YEAR
Desafortunadamente, este método se desactiva un día cada 3216 años.
Un posible método para reformar el calendario es la siguiente regla:
if year is divisible by 128, COMMON YEAR
else if year is divisible by 4, LEAP YEAR
else, COMMON YEAR
Esto tiene el beneficio de no requerir que cambiemos nuestros calendarios nuevamente por otros 625,000 años, más o menos.
Digamos que el mundo entero decide que, a partir de ahora, usamos este sistema de cada cuarto año, es un año bisiesto, excepto cada 128 años, cambiando nuestros calendarios de la siguiente manera:
YEAR GREGORIAN 128-YEAR
2044 LEAP LEAP
2048 LEAP COMMON
2052 LEAP LEAP
...
2096 LEAP LEAP
2100 COMMON LEAP
2104 LEAP LEAP
...
2296 LEAP LEAP
2300 COMMON LEAP
2304 LEAP COMMON
2308 LEAP LEAP
¿Cómo afectaría esto a nuestros algoritmos del día de la semana?
El reto
- Dada una fecha del año 2000 al año 100000, encuentre el día de la semana en este nuevo calendario.
- Cualquier formato de entrada y salida está permitido siempre que especifique claramente qué formatos está utilizando.
- Este es el código de golf, así que trate de hacer que sus soluciones sean lo más golficas posible.
Casos de prueba
"28 February 2048" -> "Friday"
"March 1, 2048" -> "Sat"
(2100, 2, 29) -> 0 # 0-indexed with Sunday as 0
"2100-02-29" -> 7 # 1-indexed with Sunday as 7
"28 Feb. 2176" -> "Wednesday"
"1-Mar-2176" -> "Th"
"28/02/100000" -> "F" # DD/MM/YYYYYY
"Feb. 29, 100000" -> 6 # 1-indexed with Sunday as 7
"03/01/100000" -> 1 # MM/DD/YYYYYY and 1-indexed with Sunday as 1
Sugerencias y comentarios sobre el desafío son bienvenidos. ¡Buena suerte y buen golf!
Respuestas:
C (gcc) , 60 bytes
Pruébalo en línea!
Modificación simple del método de Sakamoto . Toma la entrada como argumentos enteros en el orden
month, day, year
y genera el número del día (indexado en 0 el domingo).fuente
"-bed=pen+mad."
parte?char
todavía representa un número, así que puedes hacerlomod 7
directamente.Wolfram Language (Mathematica) ,
575553 bytesPruébalo en línea!
Toma tres entradas: el año, el mes y el día, en ese orden. Por ejemplo, si guarda la función anterior como
fun
, lefun[2048,2,28]
indica el día de la semana del 28 de febrero de 2048.Cómo funciona
La fórmula
m=#~Mod~128;6+Mod[(9#-m)/8-6Clip@m,28]
convierte el año en un año equivalente (un año con exactamente los mismos días de la semana) entre 6 DC y 33 DC. Para hacer esto, restamos un desplazamiento y luego tomamos el año mod 28; pero la compensación cambia cada 128 años, y durante años divisibles por 128, tenemos que hacer un nuevo ajuste porque el año equivalente no debería ser bisiesto.De todos modos, una vez hecho esto, buscamos el mes y el día en ese año equivalente usando el incorporado
DayName
.fuente
Python 2 , 67 bytes
Pruébalo en línea!
int("..."[m])
puede ser sustituido porord("-bed=pen+mad."[m])
.fuente
JavaScript,
6559 bytesUtiliza el método de Sakamoto. Da0=Sunday, 1=Monday, 2=Tuesday...
-2 bytes gracias a Misha Lavrov
-4 bytes gracias a Arnauld
fuente
~~y
solo se puede cambiar ay
. No vas a obtener un año fraccionario en la entrada, ¿verdad? Pero admito que no soy fluido en JavaScript.+y+(y>>2)-(y>>7)
?En realidad , 37 bytes
Este es un puerto de modificación de notjagan del algoritmo de Sakamoto , pero con algunos trucos basados en pila como se describe a continuación. El formato de entrada es
day, year, month
. El formato de salida es0-indexed with Sunday as 0
. Sugerencias de golf bienvenidas! Pruébalo en línea!Explicación
fuente
Jalea ,
32313028 bytesOtro puerto de modificación de notjagan del algoritmo de Sakamoto pero con un número base-250 en lugar de
032503514624
(no necesita el extra0
porque Jelly está indexado en 1). El formato de entrada esmonth, year, day
. El formato de salida es0-based with Sunday as 0
. Las sugerencias de golf son muy bienvenidas ya que la forma en que los enlaces fueron difíciles de organizar y aún puede ser fácil de jugar. Pruébalo en línea!Editar: -1 byte por usar bit shift en lugar de división entera. -1 byte de reorganizar el comienzo y el formato de entrada. -2 bytes gracias a Erik the Outgolfer y caird coinheringaahing.
Explicación
fuente