Guest User

Untitled

a guest
Jan 19th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. from operator import mul
  2. from functools import reduce
  3. from itertools import combinations
  4.  
  5. def all_combinations_from(arr, start=2):
  6. result = list()
  7. for i in range(start, len(arr) + 1):
  8. for t in combinations(arr, i):
  9. result.append(reduce(mul, t))
  10. print('combinations result: ', result)
  11. return result
  12.  
  13. def numeric_palindrome(*args):
  14. sorted_numbers = sorted(args, key=lambda x: -x)
  15. prods = all_combinations_from(sorted_numbers)
  16. prods_digits = map(lambda prod: sorted(list(str(prod))), prods)
  17. # print('prods digits: ',list (prods_digits))
  18. plaindromes = list()
  19. for prod_digits in prods_digits:
  20. plaindrome = list()
  21. while True:
  22. if not len(prod_digits): break
  23. if len(prod_digits) == 1 and len(plaindrome) % 2 == 1: break
  24. if len(prod_digits) == 1 and len(plaindrome) % 2 == 0:
  25. plaindrome = plaindrome[:int(len(plaindrome) / 2)] + prod_digits + plaindrome[int(len(plaindrome) / 2):]
  26. break
  27. last_1, last_2 = prod_digits.pop(), prod_digits.pop()
  28. if last_1 != last_2:
  29. prod_digits.append(last_2)
  30. cur_len = len(plaindrome)
  31. if cur_len % 2 == 0:
  32. plaindrome = plaindrome[:int(cur_len / 2)] + [last_1] + plaindrome[int(cur_len / 2):]
  33. elif last_1 == '0' and len(plaindrome) > 2 or last_1 != '0':
  34. cur_len = len(plaindrome)
  35. mid = int(cur_len / 2)
  36. left, mid, right = plaindrome[:mid], [] if cur_len % 2 == 0 else plaindrome[mid:mid+1], plaindrome[mid + cur_len % 2:]
  37. plaindrome = left + [last_1] + mid + [last_2] + right
  38. plaindromes.append(plaindrome)
  39. sorted_plaindromes_by_len = sorted(plaindromes, key=lambda x: -len(x))
  40. longest_plaindromes = list(filter(lambda x: len(x) == len(sorted_plaindromes_by_len[0]), sorted_plaindromes_by_len))
  41. biggest_plaindrome = sorted(longest_plaindromes, key=lambda x: -int(x[0]))[0]
  42. return int(''.join(biggest_plaindrome))
Add Comment
Please, Sign In to add comment