Leap Year
Se te da un año year del calendario gregoriano. Devuelve true si es un año bisiesto, de los que tienen un 29 de febrero, y false en caso contrario.
Un año es bisiesto cuando es divisible por 4, excepto los años divisibles por 100, que no son bisiestos a menos que también sean divisibles por 400.
Función
- yearinteger
- el año que se va a comprobar
- Devuelveboolean
- true cuando el año tiene un 29 de febrero, false en caso contrario
Restricciones
1 ≤ year ≤ 106
Ejemplos
- Entrada
- year = 2024
- Salida
- true
- Explicación
2024es divisible por4y no es un año secular, así que es un año bisiesto.
- Entrada
- year = 1900
- Salida
- false
- Explicación
1900es divisible por4, pero también es divisible por100y no por400, así que se aplica la excepción de los años de siglo y no es un año bisiesto.
- Entrada
- year = 2000
- Salida
- true
- Explicación
2000es divisible por100, lo que lo descartaría, pero también es divisible por400, lo que hace que vuelva a ser válido. Es un año bisiesto.
+16 pruebas ocultas al enviar
Pistas
Ábrelas de una en una. Cada una revela un poco más.
Un resto de
0después de dividir entre4es la primera regla. ¿Qué años la incumplen?Los años de siglo lo rompen, y los múltiplos de
400rompen a su vez la regla del siglo. Todo múltiplo de400también es múltiplo de100y de4, así que el orden de las comprobaciones determina la respuesta.Comprueba primero la divisibilidad por
400, después por100y después por4, y deja que decida la primera regla que coincida. O combínalas: divisible por 4 y no por 100, o divisible por 400.
Solución
Cada regla solo necesita un resto, así que el trabajo consiste en tres comprobaciones de divisibilidad. La trampa está en el orden: las reglas se contradicen en años como 2000, que es un año de siglo y también un múltiplo de 400. Comprueba primero la regla más específica o escribe la regla como una sola expresión cuyos paréntesis mantengan las excepciones en su lugar.
Comprueba las reglas de la más específica a la menos específica
Intuición
Las tres reglas forman una cadena de excepciones. Ser divisible por 4 hace que un año sea bisiesto; ser divisible por 100 lo deshace, y ser divisible por 400 deshace esa anulación. Un año que cumple una regla posterior siempre cumple también las anteriores: todo múltiplo de 400 es múltiplo de 100, y todo múltiplo de 100 es múltiplo de 4.
Así que la regla más específica que se cumple determina la respuesta. Comprueba primero 400, después 100 y luego 4, y devuelve el resultado en cuanto una se cumpla. Para 2000, la primera comprobación ya da como resultado sí. Para 1900, la primera comprobación falla y la segunda da como resultado no. Para 2024, las dos primeras fallan y la tercera da como resultado sí.
Si no se cumple ninguna de las tres, el año no es divisible por 4, así que es un año común.
Algoritmo
- Si
year % 400 == 0, devuelvetrue. - Si
year % 100 == 0, devuelvefalse. - Si
year % 4 == 0, devuelvetrue. - De lo contrario, devuelve
false.
def isLeapYear(year):
if year % 400 == 0:
return True
if year % 100 == 0:
return False
if year % 4 == 0:
return True
return FalseUna expresión booleana
Intuición
Lee la regla como dos formas de que un año sea bisiesto. O bien el año es divisible por 4 y no es un año de siglo, o es divisible por 400. Esa oración se traduce palabra por palabra como (year % 4 == 0 and year % 100 != 0) or year % 400 == 0.
Compruébalo con los tres ejemplos. 2024 cumple la primera parte. 1900 no cumple la primera parte porque es un año de siglo, y no cumple la segunda porque 1900 % 400 es 300. 2000 no cumple la primera parte por la misma razón que 1900, y cumple la segunda.
También puedes agruparlo de la otra manera: divisible por 4 y, o bien no es un año de siglo o es múltiplo de 400. Ambas formas coinciden para todos los años. La expresión realiza como máximo las mismas tres comprobaciones que la cadena de if.
Algoritmo
- Calcula
year % 4 == 0 and year % 100 != 0: divisible entre 4 y que no sea un siglo. - Calcula
year % 400 == 0. - Devuelve
truesi se cumple cualquiera de las dos partes.
def isLeapYear(year):
# Every 4th year, except centuries, except every 400th year.
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
Errores comunes y casos límite
Todos los errores aquí provienen de tratar la regla como una sola prueba en lugar de una cadena de excepciones.
- Comprobar solo
year % 4 == 0. Da la respuesta correcta para todos los años de1901a2099, por eso el error pasa desapercibido, y la respuesta incorrecta para1900y2100. - Probar
100antes que400en una cadena de if. La prueba de siglo devuelvefalsepara2000antes de que se ejecute la prueba de400. - Omitir la parte de divisible por 4.
year % 100 != 0 or year % 400 == 0considera que2023es un año bisiesto, porque2023no es un siglo. - Usar
year / 4cuando querías el resto. La división te dice cuántas veces cabe4; el resto te dice si cabe exactamente.
Preguntas frecuentes4
¿Cuál es la regla para un año bisiesto?
Un año gregoriano es bisiesto cuando es divisible por 4, a menos que sea divisible por 100. Un año divisible por 400 es bisiesto de todos modos. Así que 2024 y 2000 son años bisiestos, mientras que 1900 y 2100 no lo son.
¿Por qué 1900 no es un año bisiesto, pero 2000 sí?
Ambos son años de siglo, divisibles por 100, lo que normalmente excluye a un año. 2000 también es divisible por 400, y esa regla prevalece sobre la regla de los años de siglo. 1900 deja un resto de 300 al dividirlo por 400, así que sigue siendo un año ordinario.
¿Por qué existen las reglas de los siglos?
Un año solar dura aproximadamente 365.2422 días. Añadir un día cada 4 años da un promedio de 365.25, lo que supone unos 3 días de más cada 400 años. Omitir el día bisiesto en 3 de cada 4 años centenarios elimina esos 3 días. El promedio pasa a ser de 365.2425 días, lo bastante cercano como para mantener el calendario sincronizado con las estaciones durante miles de años.
¿Cuál es la complejidad temporal de comprobar si un año es bisiesto?
Es O(1) en tiempo y espacio. La comprobación requiere como máximo tres operaciones de resto y unas pocas comparaciones, independientemente del tamaño del año.
Problemas similares
Problemas que usan las mismas ideas. Resolver dos o tres es lo que fija un patrón.
Python
def isLeapYear(year):
# Escribe el código aquíCaso 1
Caso 2
Caso 3
Entrada
year = 2024
Esperado
true