viernes, 3 de agosto de 2018

Años bisiestos en Python

Reto: Bisiesto

Crear una función que dado un año diga si es bisiesto.



Podemos consultar la Wikipedia para saber qué años son bisiestos.
El calendario Juliano dio paso a calendario Gregoriano en 1582. Desde entonces se estableció la regla que nos dice cuando una año es bisiesto y por lo tanto tiene 366 días, en lugar de 365, ya que se añade un día más el 29 de febrero.

  • Un año es bisiesto si es múltiplo de 4, salvo que...
    • el año termine en 00, en cuyo caso, no será bisiesto, salvo que ...
      • el año sea múltiplo de 400, en cuyo caso, si será bisiesto.
Como podemos observar para que un año sea bisiesto existe una regla general (que sea múltiplo de 4) pero a esta regla general existe una excepción (que el año termine en 00, esto es, los finales de siglo) en cuyo caso el año no será bisiesto, y finalmente existe una excepción a la excepción anterior (que el año sea múltiplo de 400) en cuyo caso el año si será bisiesto.

Así por ejemplo, los años 2100, 2200, 2300 no serán bisiestos, pero el 2400 si lo será.


Método 1

Definimos una función que contiene un if con una condición lógica compleja que resume la regla que nos da el año bisiesto.




def bisiesto(x):
  if x%4==0 and (not(x%100==0) or x%400==0 ):
    texto='es bisiesto.'
  else:
    texto='es un año NO bisiesto.'
  return texto
x=int(input('Introduzca un año entre 1600 y 2500:'))
print(x,bisiesto(x))


Método 2

Generamos un año aleatorio y definimos una función que nos retornará True si se trata de una año bisiesto y nos retornará False si el año generado no es bisiesto. Con este método hemos optado por realizar varios if concatenados para resolver la lógica de los años bisiestos.

import random
random.seed()
x=random.randint(1600,2500)
def bisiesto(x):
  if x%4==0:
    if x%100==0:
      if x%400==0:
        return True
      else:
        return False
    else:
      return True
  else:
    return False
if bisiesto(x):
  print(x,'es un año bisiesto.')
elif not(bisiesto(x)):
  print(x,'no es un año bisiesto')


Método 3

Aplicamos en cascada los condicionales para llegar a la definición de año bisiesto que da la Wikipedia.

def is_leap(year):
    if year%400==0:
        return True
    else:
        if year%100==0:
            return False
        else:
            if year%4==0:
                return True
            else:
                return False
print('El año {} ¿es bisiesto?: {}'.format(1800,is_leap(1800)))
print('El año {} ¿es bisiesto:? {}'.format(1900,is_leap(1900)))
print('El año {} ¿es bisiesto:? {}'.format(2000,is_leap(2000)))
print('El año {} ¿es bisiesto:? {}'.format(2040,is_leap(2040)))
print('El año {} ¿es bisiesto:? {}'.format(2400,is_leap(2400)))
print('El año {} ¿es bisiesto:? {}'.format(2100,is_leap(2100)))
print('El año {} ¿es bisiesto:? {}'.format(2200,is_leap(2200)))
print('El año {} ¿es bisiesto:? {}'.format(2300,is_leap(2300)))
print('El año {} ¿es bisiesto:? {}'.format(2500,is_leap(2500)))


Método 4

Este método es equivalente al anterior pero necesita menos líneas. Se van probando tres condicionales if por ese orden. Si el primero es cierto se entra dentro y se ejecuta el return que contiene, y ya no se sigue. Si es falso se pasa a evaluar el siguiente if, y así con el resto de los condicionales. Si no se cumple ninguno de los tres se ejecuta el último return que indica que el año analizado no es bisiesto. Esto se basa en la idea de que en una función cuando se ejecuta un return ya no se sigue con el código restante de la función.

def is_leap(year):  
  if year%400==0: return True  
  if year%100==0: return False  
  if year%4==0: return True  
  return False  
print('El año {} ¿es bisiesto?: {}'.format(1800,is_leap(1800)))
print('El año {} ¿es bisiesto:? {}'.format(1900,is_leap(1900)))
print('El año {} ¿es bisiesto:? {}'.format(2000,is_leap(2000)))
print('El año {} ¿es bisiesto:? {}'.format(2040,is_leap(2040)))
print('El año {} ¿es bisiesto:? {}'.format(2400,is_leap(2400)))
print('El año {} ¿es bisiesto:? {}'.format(2100,is_leap(2100)))
print('El año {} ¿es bisiesto:? {}'.format(2200,is_leap(2200)))
print('El año {} ¿es bisiesto:? {}'.format(2300,is_leap(2300)))
print('El año {} ¿es bisiesto:? {}'.format(2500,is_leap(2500)))

1 comentario:

  1. #Crear un programa que indique si el año introducido es bisiesto o no.

    from calendar import isleap
    def Bisiesto_o_no(a:int):
    if isleap(a):
    an='Si'
    else:
    an='No'
    print( f'El año {n} {an} es bisiesto')

    if __name__=='__main__':
    n=int(input('Introduzca un año (ejemplo: 1992): ')or'1992')
    Bisiesto_o_no(n)

    ResponderEliminar