Binary Coffee

Fechas palíndromos

algorithms

No queríamos dejar pasar este día sin postear brevemente sobre esta curiosidad de que la fecha 20200202 es palíndromo, o sea, que es igual si se lee de izquierda a derecha que de derecha a izquierda. Incluso más, no importa el formato en que se represente siempre es palíndromo. La siguiente fecha con esta propiedad será en el 2030, exactamente el 3 de febrero de 2030, 03022030.

Este hecho curioso es trending topic en las redes sociales, puedes seguirlo con el hashtag #PalindromeDay. Pero si llegaste a este blog, lo más probable es que seas programador o estés aprendiendo, así que veamos algunas funcionalidades del módulo datetime de Python resolviendo el problema de encontrar otras fechas que sean palíndromos.

Este módulo datetime brinda una serie de clases para manipular fechas y duraciones de intervalos de tiempo de manera simple. En nuestro caso useremos dos:

  • datetime.date: Para representar una fecha idealizada, suponiendo que el calendario gregoriano actual siempre estuvo y siempre estar√° vigente. Par√°metros: a√Īo, mes y d√≠a.
  • datetime.timedelta : Una duraci√≥n que expresa la diferencia entre dos instancias de fechas, a una resoluci√≥n de microsegundos.

Las importamos:

from datetime import date
from datetime import timedelta

Luego definimos una función de ayuda que recibe una fecha y retorna True si la fecha es palídromo o False en caso contrario.

def IsPalindromoDate(date):
    strDate = str(date).replace('-', '')
    return strDate == strDate[: : -1]

Notar en que este caso estamos usando el formato por defecto que es YYYY-MM-DD, es por eso que es necesario eliminar los '-'.

Para buscar fechas pal√≠ndromos dividiremos la b√ļsqueda en dos partes: fechas pasadas y fechas futuras. Dicho esto necesitamos comenzar en el d√≠a de hoy:

currentDate = date.today()

Entonces ahora es cuando usaremos timedelta, crearemos un intervalo genérico de un día:

oneDay = timedelta(days=1)

Si tenemos una fecha, digamos la propia currentDate y operamos aritméticamente con oneDay veremos el resultado:

tomorrow = currentDate + oneDay
yesterday = currentDate - oneDay
print(tomorrow)
print(yesterday)

Con todo esto solo queda realizar dos ciclos para concluir nuestra b√ļsqueda de fechas capicuas:

currentDate = date.today()
print('Past palindromes:')
while str(currentDate) != '1000-01-01':
    if IsPalindromoDate(currentDate):
        print(currentDate)
    currentDate -= oneDay

currentDate = date.today() + oneDay
print('Future palindromes:')
while str(currentDate) != '2999-12-31':
    if IsPalindromoDate(currentDate):
        print(currentDate)
    currentDate += oneDay

Que encontraría fechas con la propiedad en el milenio pasado y en el milenio futuro. El resultado:

Past palindromes:
2020-02-02
2011-11-02
2010-01-02
2001-10-02
1380-08-31
1370-07-31
1350-05-31
.
.
1001-10-01
Future palindromes:
2021-12-02
2030-03-02
2040-04-02
2050-05-02
2060-06-02
.
.
2290-09-22

Conclusión

Las palabras y frases palíndromos, incluidas las fechas :) siempre han atraído la curiosidad y sirven para introducir varios aspectos fundamentales de la programación como el manejo con cadenas, ciclos y condicionales. Además, en el caso específico de este post vimos como operar con fechas y duraciones en el lenguaje Python para iterar por todos los días de un rango de fechas buscando las que cumplan cierta propiedad.

Opiniones