Day of the Programmer - HackerRank problem

Day Of The Programmer Algorithm HackerRank Solution PH

El dĆ­a 256 del aƱo se celebra el dĆ­a 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 valor booleano (falso o verdadero) si el aƱo es bisiesto o no. Function date PHP - StackOverflow answer



Fuente del Ejercicio: Hacker Rank



¡Feliz dĆ­a del Programador!