We're a place where coders share, stay up-to-date and grow their careers.
Here is a little implementation in Python3.6:
def is_narcissistic(nb: int) -> bool: return nb == sum([int(c)**len(str(nb)) for c in str(nb)]) if __name__ == '__main__': print([nb for nb in range(10000) if is_narcissistic(nb)])
Display:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474]
Awesome answer, Pierre! I have one doubt though. Wouldn't it be better to first convert nb into a string, and then just pass the string to the list comprehension, instead of doing str(nb) for every iteration? That is,
nb
str(nb)
str_nb = str(nb) return nb == sum(int(c)**len(str_nb) for c in str_nb)
This might be a little more efficient. Also, we can remove the list comprehension inside and replace it with a generator.
Yeah you're right! Thank you, that's clever!
This is fun! Here is a Python 3.5 one-liner with only one calculation of the length of nb per nb :
print([nb for nb in range(10000) if nb == sum(int(c)**l for l in [len(str(nb))] for c in str(nb))])
And now with also one conversion of str(nb) per nb:
print([nb for nb in range(10000) if nb == sum(int(c)**l for str_nb in [str(nb)] for l in [len(str_nb)] for c in str_nb)])
Here is a little implementation in Python3.6:
Display:
Awesome answer, Pierre!
I have one doubt though. Wouldn't it be better to first convert
nb
into a string, and then just pass the string to the list comprehension, instead of doingstr(nb)
for every iteration? That is,This might be a little more efficient. Also, we can remove the list comprehension inside and replace it with a generator.
Yeah you're right! Thank you, that's clever!
This is fun! Here is a Python 3.5 one-liner with only one calculation of the length of nb per nb :
print([nb for nb in range(10000) if nb == sum(int(c)**l for l in [len(str(nb))] for c in str(nb))])
And now with also one conversion of str(nb) per nb:
print([nb for nb in range(10000) if nb == sum(int(c)**l for str_nb in [str(nb)] for l in [len(str_nb)] for c in str_nb)])