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