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 <agt...@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 <pych...@gmail.com> wrote:
>
>>
>>
>> El lun., 3 sept. 2018 a las 21:12, AGTUGO (<agt...@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@python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
>
>
> --
> Arturo Muñoz Tolosa
>


-- 
Arturo Muñoz Tolosa
_______________________________________________
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es

Responder a