Advertisement
Guest User

Untitled

a guest
Aug 26th, 2015
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.25 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. import itertools
  4. import sys
  5.  
  6. def get_square_checker(max_):
  7.     squares = set(itertools.takewhile(lambda x: x <= 2 * max_ - 1, (i ** 2 for i in itertools.count())))
  8.     return lambda x: x in squares
  9.  
  10. def get_nexts(range_):
  11.     pairs = filter(lambda pair: is_square(sum(pair)), itertools.combinations(range_, 2))
  12.     nexts = {}
  13.     for (a, b) in pairs:
  14.         nexts.setdefault(a, set()).add(b)
  15.         nexts.setdefault(b, set()).add(a)
  16.     return nexts
  17.  
  18. def try_make_lists(current_list, used_digits, remaining_digits, nexts):
  19.     # used_digits and remaining_digits are passed for performance reasons only.
  20.     if not remaining_digits:
  21.         yield current_list
  22.     else:
  23.         cur_digit = current_list[-1]
  24.         for next_digit in nexts[cur_digit] - used_digits:
  25.             yield from try_make_lists(current_list + [next_digit], used_digits | {next_digit}, remaining_digits - {next_digit}, nexts)
  26.  
  27. if __name__ == '__main__':
  28.     max_ = int(sys.argv[1])
  29.     range_ = range(1, max_ + 1)
  30.     is_square = get_square_checker(max_=max_)
  31.     nexts = get_nexts(range_=range_)
  32.  
  33.     for first_digit in range_:
  34.         for r in try_make_lists([first_digit], {first_digit}, set(range_) - {first_digit}, nexts):
  35.             print(r)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement