Skip to content

Instantly share code, notes, and snippets.

@clusterfudge
Last active November 18, 2016 01:16
Show Gist options
  • Save clusterfudge/4ba398ab2ffd3c62214c3f0eee5240ce to your computer and use it in GitHub Desktop.
Save clusterfudge/4ba398ab2ffd3c62214c3f0eee5240ce to your computer and use it in GitHub Desktop.
__author__ = "Sean Fitzgerald <sean@fitzgeralds.me>"
import math
import time
def is_narcissistic(x):
result = 0
x_str = list(str(x))
x_str.sort(reverse=True)
return compute_narc(x_str, x)
def compute_narc(digits, cache=[]):
return sum([cache[digit] for digit in digits])
def int_to_sorted_digits(i):
l = list(str(i))
l.sort(reverse=True)
return [int(x) for x in l]
def generate_digit_sorted_numbers(length):
numbers = [9] * length
while numbers[0] > 0:
idx = -1
if numbers[idx] >= 0:
yield numbers
numbers[idx] -= 1
else:
first_0 = numbers.index(-1)
numbers[first_0 - 1] -= 1
cur = first_0
while cur < length:
numbers[cur] = numbers[cur - 1]
cur += 1
def compare_lists(list1, list2):
if len(list1) != len(list2):
return False
for i in xrange(len(list1)):
if list1[i] != list2[i]:
return False
return True
if __name__ == "__main__":
import sys
start_ts = time.time()
min_length=2
if len(sys.argv) > 1:
min_length = int(sys.argv[1])
for i in xrange(min_length, 61):
results = set()
pow_cache=[j**i for j in range(0, 11)]
for row in generate_digit_sorted_numbers(i):
narc = compute_narc(row, pow_cache)
narc_digits = int_to_sorted_digits(narc)
if compare_lists(row, narc_digits):
results.add(narc)
for narc in sorted(results):
print("[{:8.3f}] {}".format(time.time() - start_ts, narc))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment