En mi sitio web, los usuarios ingresan su fecha de nacimiento en el estilo xx.xx.xx
: tres números de dos dígitos separados por puntos. Desafortunadamente, olvidé decirles a los usuarios exactamente qué formato usar. Todo lo que sé es que una sección se usa para el mes, otra para la fecha y otra para el año. El año definitivamente es en el siglo 20 (1900-1999), por lo que el formato 31.05.75
significa 31 May 1975
. Además, supongo que todos usan el calendario gregoriano o juliano.
Ahora, quiero revisar mi base de datos para aclarar el desorden. Me gustaría comenzar tratando con los usuarios con las fechas más ambiguas, es decir, aquellas donde el rango de fechas posibles es el mayor.
Por ejemplo, la fecha 08.27.53
significa 27 August 1953
en el calendario gregoriano o juliano. La fecha en el calendario juliano es 13 días después, por lo que el rango es justo 13 days
.
En contraste, la notación 01.05.12
puede referirse a muchas fechas posibles. Lo primero es 12 May 1901 (Gregorian)
, y lo último es 1 May 1912 (Julian)
. El rango es 4020 days
.
Reglas
- La entrada es una cadena en el formato
xx.xx.xx
, donde cada campo tiene dos dígitos y está rellenado con ceros. - La salida es el número de días en el rango.
- Puede suponer que la entrada siempre será una fecha válida.
- No puede usar ninguna fecha incorporada o funciones de calendario.
- El código más corto (en bytes) gana.
Casos de prueba
01.00.31
=>12
29.00.02
=>0
(La única posibilidad es29 February 1900 (Julian)
)04.30.00
=>13
06.12.15
=>3291
5, May 1975
supone que debe ser31st
? Además, ¿tenemos que tener en cuenta los años bisiestos?Respuestas:
Pyth, 118 bytes
Pruébelo en línea: Demostración o Test Suite .
Conocimiento necesario de los calendarios juliano y gregoriano.
Calendario juliano y gregoriano son bastante similares. Cada calendario divide un año en 12 meses, cada uno con 28-31 días. Los días exactos en un mes son
[31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
. La única diferencia entre los calendarios es su definición de año bisiesto. En el calendario juliano, cualquier año divisible por 4 es un año bisiesto. El calendario gregoriano es un poco más específico. Cualquier año divisible por 4 es un año bisiesto, excepto el año divisible por 100 y no divisible por 400.Entonces, en el siglo XX, solo un año es diferente. El año 1900, que es un año bisiesto en el calendario juliano, pero no un año bisiesto en el calendario gregoriano. Entonces, la única fecha que existe en un calendario pero no en el otro calendario es el día
29.02.1900
.Debido a la definición de año bisiesto diferente, hay una diferencia entre una fecha en el calendario juliano y el calendario gregoriano. 12 días de diferencia para una fecha anterior al
29.02.1900
, y 13 días de diferencia para fechas posteriores al29.02.1900
.Pseudocódigo simplificado
Explicación detallada del código
La primera parte
M++28@j15973358 4G&qG2!%H4
define una funcióng(G,H)
, que calcula el número de días en un mesG
de un añoH
en el calendario juliano.Y la siguiente parte es solo el bucle for y los ifs. Tenga en cuenta que interpreto
N
en el formato(month, year, day)
. Solo porque ahorra algunos bytes.fuente
Perl 5 , 294 bytes
Pruébalo en línea!
298 bytes cuando se eliminan espacios, líneas nuevas y comentarios.
Las líneas 1-4 inicializan (si no se hace) los hashes
%g
y%j
donde los valores son los números de los días gregoriano y juliano, contando desde Jaunary 1st 1900 hasta el 31 de diciembre de 1999.La línea 5 pone la fecha de entrada en $ 1, $ 2 y $ 3.
La línea 9 enumera las seis permutaciones de esos tres números de entrada.
La línea 8 convierte esos seis en dos números cada uno, los números de los días gregoriano y juliano, pero solo aquellos que son fechas válidas.
La línea 7 se asegura de eso, filtra los números de día no existentes.
La línea 6 ordena la lista de números de fecha válidos desde el más pequeño hasta el más grande.
La línea 10 devuelve la diferencia entre el último y el primero (máximo y mínimo), que era el rango deseado.
fuente