fork(1) download
  1. import itertools
  2.  
  3.  
  4. def calc_word_value(reversed_word, symbol_map):
  5. result = 0
  6. for letter, factor in reversed_word:
  7. result += symbol_map[letter] * factor
  8. return result
  9.  
  10. def print_result(words, answer, variant):
  11. t_words = []
  12. for word in words:
  13. t_words.append("".join(str(variant[l]) for l in word))
  14.  
  15. t_answer = "".join(str(variant[l]) for l in answer)
  16.  
  17. print("{:15s} {} = {}".format("INPUT:", " + ".join(words), answer))
  18. print("{:15s} {} = {}".format("SOLUTION:", " + ".join(t_words), t_answer))
  19. print("")
  20.  
  21.  
  22. def solver(puzzle, full_search=False):
  23. words_line, answer = puzzle.split('=')
  24. words = [word.strip() for word in words_line.split('+')]
  25. answer = answer.strip()
  26. all_words = words + [answer]
  27.  
  28. # 'abcd' --> [('d', 1), ('c', 10), ('b', 100), ('a', 1000)]
  29. rev_words = []
  30. for word in words:
  31. rev_word = [(letter, 10**num) for num, letter in enumerate(word[::-1])]
  32. rev_words.append(rev_word)
  33. rev_answer = [(letter, 10**num) for num, letter in enumerate(answer[::-1])]
  34.  
  35. letters = sorted(set("".join(all_words)))
  36. LEN = len(letters)
  37.  
  38. for digits_selection in itertools.combinations(range(10), len(letters)):
  39. for digits_permutation in itertools.permutations(digits_selection):
  40. # make dict: letter --> digit (int)
  41. variant = dict(zip(letters, digits_permutation))
  42. is_allowed = True
  43. for word in all_words:
  44. if variant[word[0]] == 0:
  45. is_allowed = False
  46.  
  47. if is_allowed:
  48. words_sum = 0
  49. for rev_word in rev_words:
  50. words_sum += calc_word_value(rev_word, variant)
  51.  
  52. answer_sum = calc_word_value(rev_answer, variant)
  53. if words_sum == answer_sum:
  54. print_result(words, answer, variant)
  55. if not full_search:
  56. return
  57.  
  58.  
  59. full_search = False
  60.  
  61. solver("send + more = money", full_search=full_search)
  62. solver("ZEROES + ONES = BINARY", full_search=full_search)
  63. solver("COUPLE + COUPLE = QUARTET", full_search=full_search)
  64. solver("DO + YOU + FEEL = LUCKY", full_search=full_search)
  65. solver("ELEVEN + NINE + FIVE + FIVE = THIRTY", full_search=full_search)
Time limit exceeded #stdin #stdout 5s 9092KB
stdin
Standard input is empty
stdout
Standard output is empty