Day of the Programmer - HackerRank problem

Day of the Programmer - HackerRank problem

El dia 256 del año se celebra el dia de los programadores (13 de septiembre los años normales y 12 de septiembre los bisiestos). El número 256 (2^⁸) fue el elegido porque es el número de distintas combinaciones que pueden representarse con 8 bits, número muy conocido entre los programadores.

Enunciado del ejercicio

Marie inventó una máquina del tiempo y quiere probarla viajando en el tiempo para visitar Rusia en el Día del Programador (el día 256 del año) durante un año en el rango inclusivo de 1700 a 2700.

De 1700 a 1917, el calendario oficial de Rusia fue el calendario juliano; desde 1919 utilizaron el sistema de calendario gregoriano . La transición del sistema de calendario juliano al gregoriano ocurrió en 1918, cuando el día siguiente al 31 de enero fue el 14 de febrero. Esto significa que en 1918, el 14 de febrero era el día 32 del año en Rusia.

En ambos sistemas de calendario, febrero es el único mes con una cantidad variable de días; tiene 29 días durante un año bisiesto y 28 días durante los demás años. En el calendario juliano, los años bisiestos son divisibles por 4; en el calendario gregoriano, los años bisiestos son cualquiera de los siguientes:

Divisible por 400.

Divisible por 4 y no divisible por 100.

Dado un año, y, encuentre la fecha del día 256 de ese año de acuerdo con el calendario oficial ruso durante ese año. Luego imprímalo en el formato dd.mm.yyyy, donde ddes el día de dos dígitos, mmes el mes de dos dígitos y yyyy es y.

Por ejemplo, el dado el año = 1984. 1984 es divisible por 4, por lo que es un año bisiesto. El día 256 de un año bisiesto después de 1918 es el 12 de septiembre, por lo que la respuesta es 12-09-1984.

Función descriptiva

Complete la función dayOfProgrammer. Debería devolver una cadena que represente la fecha del día 256 del año indicado.

dayOfProgrammer tiene los siguientes parámetros:

año: un entero

Formato de entrada

Un solo entero que denota el año.

Restricciones

1700 < year < 2700

Formato de salida

Imprima la fecha completa del día del programador durante el año en el formato dd.mm.yyyy, donde dd es el día de dos dígitos, mm es el mes de dos dígitos y yyyy es el año.

Entrada de muestra 0

2017

Salida de muestra 0

13.09.2017

Explicación 0

En el año = 2017, enero tiene 31 días, febrero tiene 28 días, marzo tiene 31 días, abril tiene 30 días, mayo tiene 31 días, junio tiene 30 días, julio tiene 31 días y agosto tiene 31 días. Cuando sumamos el número total de días en los primeros ocho meses, obtenemos 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 = 243. El día del programador es el día 256, entonces calcula 256 - 243 = 13 para determinar que cae el día 13 del noveno mes (septiembre). Luego imprimimos la fecha completa en el formato especificado, que es 13.09.2017.

Entrada de muestra 1

2016

Salida de muestra 1

12.09.2016

Explicación 1

Año = 2016 es un año bisiesto, por lo que febrero tiene 29 días, pero todos los demás meses tienen el mismo número de días que en 2017. Cuando sumamos el número total de días en los primeros ocho meses, obtenemos 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 = 244. El día del programador es el día 256, entonces calcule 256 - 244 = 12 para determinar que cae en el día 12 del noveno mes (septiembre). Luego imprimimos la fecha completa en el formato especificado, que es 12.09.2016.

Entrada de muestra 2

1800

Salida de muestra 2

12.09.1800

Explicación 2

Dado que 1800 es un año bisiesto según el calendario juliano. El día es el 12 de septiembre.

Solución

PHP

function dayOfProgrammer($year) {
    // Write your code here
    if($year == 1918){
        return ('26.09.'.$year);
    }
    else if($year >= 1700 && $year <= 1917){
        return ($year % 4 == 0 ? '12.09.'.$year : '13.09.'.$year);
    }else if($year > 1918 && $year <= 2700){
        return (date('L', mktime(0, 0, 0, 1, 1, $year)) ? '12.09.'.$year : '13.09.'.$year);
    }   

}

Explicación

Si el año es igual a 1918 debido a la transición que hubo en Rusia en cuanto al uso del calendario Juliano al calendario Gregoriano, el 14 de febrero fue el día 32 del año, por lo tanto ese año 1918 el día del programador, el día 256 del año fue el 26 de septiembre.
El ejercicio explica que en el calendario juliano que estuvo en Rusia antes de 1918 las condiciones para que un año bisiesto son diferentes a las del calendario gregoriano, por lo tanto se debe hacer la condición de cuando el año era menor o igual a 1917, o mayor a 1918 para evaluar de diferente manera el año bisiesto.

La función date('L', mktime(0, 0, 0, 1, 1, $year) en PHP devuelve un booleano si el año es bisiesto o no. Function date PHP - StackOverflow answer



Fuente del Ejercicio: Hacker Rank



¡Feliz día del Programador!