Mostrando entradas con la etiqueta AdventOfCode2024. Mostrar todas las entradas
Mostrando entradas con la etiqueta AdventOfCode2024. Mostrar todas las entradas

miércoles, 8 de enero de 2025

Python: dos maneras de calcular la cantidad de cifras de un número natural

Hace muchos años escribí una entrada titulada ¿Cuántas cifras tiene un número? Por ejemplo, el factorial de 1.000.000

Por aquel entonces seguía programando principalmente en lenguaje C++ y profundizaba en software matemático, como wxMaxima, Mathematica, Sage, etc.

Empezaba a hacer alguna cosita en Python y ahora el lenguaje que más utilizo, por diferentes motivos que ahora no vienen al caso.

 https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Python.svg/240px-Python.svg.png

El tema es que resolviendo el problema 11 del Advent of Code 2024 hay que calcular la cantidad de cifras de números. Lo primero que pensé es utilizar la función len() sobre la conversión del número a cadena de caracteres:

len(str(natural))

Pero es cierto que, como comentaba en la entrada antigua, podemos calcular la cantidad de cifras de un número utilizando el logaritmo en base 10 (quedándonos la parte entera):

from math import log10

int(log10(natural))

Si sólo tenemos que calcular la cantidad de cifras de unos pocos números es prácticamente indiferente utilizar una manera u otra. Tal vez yo opte por la primera por no tener que importar funciones de librerías.

Sin embargo, si hay que realizar ese cálculo muchas muchas veces, ¿cuál será más rápido? Para contestar dicha pregunta he hecho dos programas sencillos para calcular el tiempo de ejecución.


    - Versión len

import time
inicio = time.time()
for i in range(1,100000000):
    len(str(i))
fin = time.time()
print(fin-inicio)

    - Version log10

from math import log10
import time
inicio = time.time()
for i in range(1,100000000):
    int(log10(i))
fin = time.time()
print(fin-inicio)


En mi ordenador el tiempo de ejecución del primer programa ronda los 11 segundos, mientras que el del segundo no llega a los 9 segundos.

Por tanto, en las condiciones planteadas, el logaritmo es la opción más rápida. Por otra parte, ¿qué pasa si el número puede ser 0? Dicho método no sirve. Si añadimos un condicional dentro del bucle, ¿seguirá siendo el método más rápido?

Lo dejo como ejercicio para quien quiera averiguarlo y compartir su respuesta :-)

domingo, 15 de diciembre de 2024

Advent of Code 2024

El otro día mi compañero Álvaro, como sabe que me gusta programar, me mandó el enlace de una web que hasta ahora no conocía: Advent of Code

Esta página viene a simular los típicos calendarios de adviento en los que cada día abres una pestañita y dentro hay un regalito o un objeto sorpresa.

Fuente de la imagen: https://images.app.goo.gl/U1gv2MDuoNBKLRe57


En este caso lo que se abre cada día es un problema que hay que resolver programando código.

Ayer comencé y dado que los voy haciendo he pensado que iré subiendo mi manera de resolver los problemas utilizando Python. Cuando comencé sólo quería encontrar la solución para avanzar al siguiente día pero no tenía intención de compartirlo por lo que no he ido haciendo los comentarios pertinentes en el código. Cuando pueda los incluiré por si le resulta de utilidad a alguien.

Iré subiéndolo en un repositorio de GitHub y haré entradas diferentes para los problemas (no sé si todos, pero al menos para algunos).