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