Bloques de construcción de calendario inteligentes

  Hoy descubrí accidentalmente un juguetito muy misterioso, que se puede utilizar para consultar el día de la semana en una fecha determinada. Gire el año al mes correspondiente y podrá comprobar el día de la semana específico de ese mes. De repente se sintió increíble.

Inesperadamente, comencé a descubrir el principio nuevamente: así que invoqué la fórmula de Zeiler, latente durante mucho tiempo, y una serie de sus transformaciones. No quiero decir nada más, pero la fórmula expresada por este juguete se parece más a la siguiente:día laborable = [C//4 - 2*C + y + y//4 + 13 * (M+1) // 5 + d - 1] % 7

C es el siglo menos uno, y son los dos últimos dígitos del año, M es el mes y d es el día. Enero y febrero deben
calcularse con base en los meses 13 y 14 del año anterior, en este momento C e y se calcularán con base en el año anterior.

Y prefiero la siguiente fórmula fácil de entender:

día laborable = [(Y-1) + (Y-1)//4 - (Y-1)//100 + (Y-1)//400 + 26 * (M+1) // 10 + d] % 7

Y es el año, M es el mes y d es el número de días. Enero y febrero deben calcularse con base en los meses 13 y 14 del año anterior, en este momento el valor de Y se basa en el año anterior.
El número calculado se divide nuevamente por 7 y el resto es el día de la semana. Por ejemplo, si el resto es 0, es domingo.

Esta fórmula es una regla, y esta regla en realidad fue refinada y resumida por un antiguo sabio.

Para deducirlo necesitamos primero otra fecha como punto fijo para saber qué día de la semana es, aquí el último día 12-31 a.C. es domingo, que implícitamente se elige como ancla.

A continuación, si utiliza un algoritmo largo pero fácil de entender, calcule cuántos días quedan hasta ese día. Luego mod 7 y el resto se puede usar para obtener el día de la semana.

(Y-1)*365+(Y-1)//4-(Y-1)//100+(Y-1)//400+(primeros días de este año)

Por ejemplo, el día de redacción de este artículo, 3 de septiembre de 2022 , es

(2022-1)*365 + (2022-1)//4- (2022-1)//100 + (2022-1)//400 + (31+28+31+30+31+30+31+ 31+3)=738401

Esta cosa se puede dividir entre 7 y el resto es 6, por lo que es sábado.

Llamo al cálculo anterior la narrativa de la lógica misma; la característica es que el proceso de cálculo consiste en decir las cosas directamente. Luego viene la metamorfosis de las matemáticas. La gente llama a estas transformaciones y simplificaciones la belleza de las matemáticas.

Debes tener en cuenta que la base de este algoritmo es encontrar el resto de 7. Entonces para simplificar elegantemente (la parte pervertida de las matemáticas), la lógica de esta historia comenzó a simplificarse nuevamente buscando reglas:

(Y-1)*365 = (Y-1)*(364+1) #Porque 364=52*7

Además: 52*7*(Y-1) + (Y-1); Así que aquí solo quiero (Y-1)//7, porque la parte anterior es definitivamente divisible por 7, así que simplemente la tiro.

El resto se debe a los años bisiestos, porque 100 años no son bisiestos, pero 400 años sí lo son. La idea central de esta serie de fórmulas para acumular días es redondear y simplificar el número 7.

W = (Y-1) + (Y-1)//4 - (Y-1)//100 + (Y-1)//400 + D

A continuación, llega el momento de calcular los primeros días del año y comenzamos a observar el patrón mensual. Primero que nada, recuerda que si este mes es divisible por 7, entonces es un ciclo de adoración completo. Sabemos que el número que ronda 30 y es divisible por 7 es 28, entonces tenemos,

mes Enero Febrero Marzo Abril Puede Junio Julio Agosto Septiembre Octubre Noviembre Diciembre
Más de 7 meses 3 0 o 1 3 2 3 2 3 3 2 3 2 3
La acumulación de 7 meses restantes 3 3 o 4 6 o 7 8 o 9 11 o 12 13 o 14 16 o 17 19 o 20 21 o 22 24 o 25 26 o 27 29 o 30

Cuando llegamos aquí, podemos ver que de marzo a diciembre hay 10 meses consecutivos de estabilidad, un total de 26 días. Si desea desglosarlo con más detalle, verá dos 32323 de marzo a diciembre. Los restantes de enero y febrero se colocan al final y se convierten en 13 y 14. De hecho, se consideran los números de serie 13 y 14. Pero el año se contará como el número de serie del año anterior. La razón de este intento aquí es la incertidumbre de febrero: si se puede considerar como el último mes, no hay necesidad de discutir los años ordinarios y bisiestos caso por caso, y habrá menos variables desconocidas en la formula.

Marzo Abril Puede Junio Julio Agosto Septiembre Octubre Noviembre Diciembre 13 meses (es decir, enero del año siguiente) 14 meses (es decir, febrero del año siguiente)
3 2 3 2 3 3 2 3 2 3 3 el resto no importa
3 5 8 10 13 dieciséis 18 21 23 26 29

Recuerde, debido a que este asunto en sí es encontrar la relación de divisibilidad entre los días desde el último día antes de Cristo hasta el presente y el 7, por lo que cuando enero y febrero se trasladan al final del año, es conveniente calcular los días acumulados que exceden 28. Está bien. Aunque parezca abstracto y repugnante, lo esencial es seguir la situación del 7 a 0. Los días que se reducen en 7 en la parte del año ya se han calculado anteriormente.

Después de no tener en cuenta las partes del año que son divisibles por 7, lo que queda es el excedente al final de cada mes y el mes en curso:

acumulado = 13 * (M+1) // 5;  (M\geq 3)

Se puede entender que la operación de redondeo a la baja se utiliza para realizar el ciclo de 13 días acumulados correspondientes a 5 meses consecutivos. Por coincidencia, enero también es 13. También es un 3, que es la posición donde comienza el siguiente ciclo de este ciclo estable de dos partes (32323 32323) de más de 28, sin destruirlo. Febrero, es decir, 14 meses, ha vuelto a terminar.

Como nota al margen, siempre siento que esta parte acumulada tiene algún significado a la hora de obtener la respuesta a la fórmula calculada. Porque después de todo, siempre que tenga sentido que M esté entre [3,14], está bien. Después de todo, esto es solo un algoritmo limitado en el mundo real, no un problema puramente matemático .

Finalmente, los días reducidos por 7 en los años anteriores se suman con los días reducidos por 7 este año y se dividen nuevamente por 7:día laborable = [(Y-1) + (Y-1)//4 - (Y-1)//100 + (Y-1)//400 + 26 * (M+1) // 10 + d] % 7

Permítanme suspiro, comprar un reloj mecánico con calendario permanente no es barato, pero su lógica subyacente se puede expresar con un juguete hecho a mano que sólo cuesta unos pocos yuanes. Qué interesante es. En la imagen del juguete en la parte superior, también puedes ver en su disco que está constantemente en mod 7 mod 4. Realmente no puedo darme el lujo de tomarme el tiempo para explicar detalladamente el funcionamiento del juguete, lo cual es una lástima.

Siento el límite superior de mis capacidades de comprensión y expresión en este momento.

Gracias por la guía de este artículo: Cómo calcular rápidamente el día de la semana en una fecha blog-CSDN de is_ljx0305

Supongo que te gusta

Origin blog.csdn.net/u011410413/article/details/126680139
Recomendado
Clasificación