Munchausen numbers: Difference between revisions
Content added Content deleted
(→JS ES6) |
(→{{header|Python}}: defining an '''isMunchausen''' predicate in terms of a fold) |
||
Line 1,257: | Line 1,257: | ||
<pre>1 |
<pre>1 |
||
3435</pre> |
3435</pre> |
||
Or, defining an '''isMunchausen''' predicate in terms of a fold, (and reaching for a specialised '''digitToInt''', which turns out to be a little faster than applying the more general built-in '''int()''') |
|||
<lang python>from functools import (reduce) |
|||
# isMuchausen :: Int -> Bool |
|||
def isMunchausen(n): |
|||
return n == foldl( |
|||
lambda n: lambda c: (lambda v=digitToInt(c): n + v**v)() |
|||
)(0)(str(n)) |
|||
# main :: IO () |
|||
def main(): |
|||
print ( |
|||
filter(isMunchausen, xrange(5000)) |
|||
) |
|||
# GENERIC -------------------------------------------------- |
|||
# digitToInt :: Char -> Int |
|||
def digitToInt(c): |
|||
oc = ord(c) |
|||
if 48 > oc or 102 < oc: |
|||
return None |
|||
else: |
|||
dec = oc - ord('0') |
|||
hexu = oc - ord('A') |
|||
hexl = oc - ord('a') |
|||
return dec if 9 >= dec else ( |
|||
10 + hexu if 0 <= hexu and 5 >= hexu else ( |
|||
10 + hexl if 0 <= hexl and 5 >= hexl else None |
|||
) |
|||
) |
|||
# foldl :: (a -> b -> a) -> a -> [b] -> a |
|||
def foldl(f): |
|||
return lambda a: lambda xs: ( |
|||
reduce(lambda x, y: f(x)(y), xs, a) |
|||
) |
|||
main() |
|||
</lang> |
|||
<pre>[1, 3435]</pre> |
|||
=={{header|Racket}}== |
=={{header|Racket}}== |