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

AGTUGO agtugo en gmail.com
Mie Sep 5 00:51:15 EDT 2018


Después de ver los tiempos de ejecución obviamente aquellos métodos que
hicieron un for pues fueron más lentos, los que generaron los números para
ser sumados pues son los más rápidos, lo cual no es ninguna sorpresa. Creo
que la mayoría de la gente no busca velocidad en python pero hay casos
donde optimizaciones pequeñas hacen la diferencia, al final creo que lo
mejor para optimizar pues es escribir en c o en cython algunas funciones en
particular. Creo que mucho más fácil de mantener en cython. Prepararé una
comparación de todos los métodos aquí expuestos en cPython, pypy,
adicionalmente numoy y cython, para cerrar esta discusión y tratar de
llegar a algo que pueda ser referenciado en el futuro.

On Tue, Sep 4, 2018 at 10:10 PM AGTUGO <agtugo en gmail.com> wrote:

> Adicionalmente me gusta verlo como conjuntos A union B.
>
> def euler001_with_sets(n: int, multiples:Tuple[int]) -> int:
>     union_set = set()
>     all_sums_set = (set(range(0,n,mul)) for mul in multiples)
>     union_set = union_set.union(*all_sums_set)
>     return sum(union_set)
>
>
>
> On Tue, Sep 4, 2018 at 9:35 AM AGTUGO <agtugo en gmail.com> wrote:
>
>> 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
>>
>
>
> --
> Arturo Muñoz Tolosa
>


-- 
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/ef20096e/attachment.html>


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