[Python-es] suma de multiplos de 3 y 5

AGTUGO agtugo en gmail.com
Mar Sep 4 10:35:20 EDT 2018


Aquí lo único que haría para cualquier caso es sacar la comparación en una
funciòn para que no este tan hardcoded

from typing import List, Tuple

begin = 0
end = 1000
multiples= (3,5)

"""
Esta función revisa si es divisible entre todos los multiplos propuestos
dentro del mundo
de los naturales y retorna un booleano en caso de que así sea
"""
def is_divisible(tb_divided:int, multiples: List[int]) -> bool:
    return any((tb_divided%mul == 0 for mul in multiples))

def euler001(n: int, multiples:Tuple[int]) -> int:
    return sum(i for i in range(1, n) if is_divisible(i,multiples))

print(euler001(end, multiples))



On Tue, Sep 4, 2018 at 5:33 AM Chema Cortes <pych3m4 en gmail.com> wrote:

>
>
> El lun., 3 sept. 2018 a las 21:12, AGTUGO (<agtugo en gmail.com>) escribió:
>
>> """
>> Problema tomado de
>> https://projecteuler.net/problem=1
>>
>>
>> If we list all the natural numbers below 10 that are multiples
>> of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
>> Find the sum of all the multiples of 3 or 5 below 1000.
>>
>> Si listamos todos los numeros naturales menores a 10 que son
>> múltiplos de 3 o 5 obtenemos 2, 5, 6 y 9. La suma de los múltiplos es 23.
>> Encuentra la suma de los múltiplos de 3 o 5 menores de 1000.
>>
>>
>> """
>>
>> """
>> Este es mi aporte de código no esta diseñado para ser eficiente,
>> el objetivo es jugar con el lenguaje. Ojalá puedan compartir
>> una visión interesante de como resolver este problema.
>> Si tienen una forma más eficiente de hacer el set o más elegante también
>> es bienvenido.
>> Saludos.
>> """
>>
>> import itertools
>> begin = 0
>> end = 1000
>> multiples= (3,5)
>>
>> x = [range(begin,end,i) for i in multiples]
>> x = sum(set(itertools.chain(*x)))
>>
>> print(x)
>>
>>
> Con este tipo de retos, es interesante que sea lo más simple posible. En
> el enunciado sólo pide la suma, no es preciso guardar ninguno de los
> resultados intermedios.
>
> Lo más simple sería:
>
> def euler001(n: int) -> int:
>     return sum(i for i in range(1, n) if i%3 == 0 or i%5 ==0)
>
> ... que es una forma concisa de poner lo que propone agus en otro mensaje.
>
> Una forma más efectiva, aunque muy poco "escalable" en caso de que fueran
> más múltiplos a considerar:
>
> def euler001(n: int) -> int:
>     return sum(range(3, n, 3)) + sum(range(5, n, 5)) - sum(range(15, n,
> 15))
>
>
> --
> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
> https://blog.ch3m4.org
> Buscador Python Hispano: http://busca.ch3m4.org
> <https://blog.ch3m4.org/pages/busqueda-python-es/>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
>


-- 
Arturo Muñoz Tolosa
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20180904/3f75b88b/attachment.html>


Más información sobre la lista de distribución Python-es