57 lines
1.2 KiB
Python
57 lines
1.2 KiB
Python
'''Munchausen numbers'''
|
|
|
|
from functools import (reduce)
|
|
|
|
|
|
# isMunchausen :: Int -> Bool
|
|
def isMunchausen(n):
|
|
'''True if n equals the sum of
|
|
each of its digits raised to
|
|
the power of itself.'''
|
|
def powerOfSelf(d):
|
|
i = digitToInt(d)
|
|
return i**i
|
|
return n == reduce(
|
|
lambda n, c: n + powerOfSelf(c),
|
|
str(n), 0
|
|
)
|
|
|
|
|
|
# main :: IO ()
|
|
def main():
|
|
'''Test'''
|
|
print(list(filter(
|
|
isMunchausen,
|
|
enumFromTo(1)(5000)
|
|
)))
|
|
|
|
|
|
# GENERIC -------------------------------------------------
|
|
|
|
# digitToInt :: Char -> Int
|
|
def digitToInt(c):
|
|
'''The integer value of any digit character
|
|
drawn from the 0-9, A-F or a-f ranges.'''
|
|
oc = ord(c)
|
|
if 48 > oc or 102 < oc:
|
|
return None
|
|
else:
|
|
dec = oc - 48 # ord('0')
|
|
hexu = oc - 65 # ord('A')
|
|
hexl = oc - 97 # ord('a')
|
|
return dec if 9 >= dec else (
|
|
10 + hexu if 0 <= hexu <= 5 else (
|
|
10 + hexl if 0 <= hexl <= 5 else None
|
|
)
|
|
)
|
|
|
|
|
|
# enumFromTo :: (Int, Int) -> [Int]
|
|
def enumFromTo(m):
|
|
'''Integer enumeration from m to n.'''
|
|
return lambda n: list(range(m, 1 + n))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|