Munchausen numbers: Difference between revisions

Content added Content deleted
(→‎{{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}}==