Perfect numbers: Difference between revisions
→{{header|Python}}: Added a slightly faster variant
(→Javascript ES6: Updated primitives) |
(→{{header|Python}}: Added a slightly faster variant) |
||
Line 2,140:
Functional style:
<lang python>perf = lambda n: n == sum(i for i in xrange(1, n) if n % i == 0)</lang>
Or, a little faster (by restricting the search space):
<lang python>from functools import (reduce)
from operator import (add)
from math import (sqrt)
def main():
print(filter(perfect, xrange(1, 10000)))
# perfect:: Int - > Bool
def perfect(n):
lows = filter(
lambda x: 0 == (n % x),
xrange(1, 1 + int(sqrt(n)))
)
return (1 < n) and (n == reduce(
add,
lows + concatMap(
lambda x: (
lambda y=n / x: [y] if x != y else []
)()
)(lows), 0) / 2)
# GENERIC -----------------------------------------
# concatMap :: (a -> [b]) -> [a] -> [b]
def concatMap(f):
return lambda xs: (
reduce(add, map(f, xs), [])
)
main()</lang>
{{Out}}
<pre>[6, 28, 496, 8128]</pre>
=={{header|R}}==
|