Euler 1 (Python)

Project Euler es un sitio web que reta a los programadores a resolver problemas matemáticos mediante código. Me parece entretenido. Voy a ir resolviendo problemas y posteando mi solución en Python acompañada de comentarios sobre el código que puedan servirles a quienes están empezando a aprender el lenguaje.

Enunciado 1

Si listamos todos los números menores a 10 que son múltiplos de 3 o 5, obtenemos 3, 5, 6 y 9. La suma de esos múltiplos es 23.

Encontrar la suma de todos los múltiplos de 3 o 5 menores a 1000.

Solución

La solución fue obtenida en el intérprete interactivo de Python 2.5.2:

>>> def mults(n=10):
...     r = []
...     for i in range(1, n):
...             if i % 3 == 0:
...                     r.append(i)
...             elif i % 5 == 0:
...                     r.append(i)
...     return r
...
>>> mults()
[3, 5, 6, 9]
>>> sum(mults())
23
>>> sum(mults(n=1000))
233168

Python tips

  • En la definición de la función mults se incluye un argumento por defecto n con valor 10. Cuando más adelante se llama a esta función sin parámetros, n toma el valor por defecto.
  • La función range, incluida en el lenguaje devuelve una lista de números sobre la que se puede iterar. Muy útil para usar con la estructura for. Más información haciendo help(range) en el intérprete interactivo.

About Juanjo

Mi nombre es Juanjo Conti, vivo en Santa Fe y soy Ingeniero en Sistemas de Información. Mi lenguaje de programación de cabecera es Python; lo uso para trabajar, estudiar y jugar. Como hobby escribí un libro de cuentos que se puede descargar gratuitamente.
This entry was posted in Aprendiendo Python, Problemas and tagged , . Bookmark the permalink.
  • http://patriciogomez.com.ar patricio

    Excelente JJ Conti, siempre en el camino de la enseñanza!

    Ahora, no es más elegante reemplazar los dos condicionales por la siguiente sentencia:

    if (i % 3) * (i % 5) == 0:

    Salduos

  • Juanjo

    Está buena! un poquito más oscura, pero buena.

  • Matias

    Otra variante: definís un filtro
    def f(n): return n%3==0 or n%5==0
    y luego con eso filtras el range
    sum(filter(f,range(1000)))

  • http://nacho.larrateguy.com.ar Nacho

    ¡Muy bueno Matías!
    Ahora en una línea (usando expresiones lambda):
    sum(filter((lambda x: (x % 5 == 0) | (x % 3 == 0)),range(10)))

    Está bueno resolver ese tipo de problemas, y Python (como has demostrado en otros post Juanjo) se adapta muy bien a este tipo de soluciones.

  • http://nqnwebs.com/blog martin gaitan

    Mi solución:

    sum([i for i in range(1000) if (i % 3 == 0 or i%5==0)])