import random
import time
def easy_solve(num1, num2, ans):
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
input = (num1 + num2 + ans)
nums_used = input.replace('x', '')
[nums.remove(int(i)) for i in nums_used]
no_answer = True
while no_answer:
temp_input = input[:]
temp_nums = nums[:]
while 'x' in temp_input:
for i in range(0, len(temp_input)):
if temp_input[i] == 'x':
rand_num = random.randrange(0, len(temp_nums))
temp_input = temp_input[:i] + str(temp_nums[rand_num]) + temp_input[i+1:]
temp_nums.remove(temp_nums[rand_num])
num1 = int(temp_input[0] + temp_input[1] + temp_input[2])
num2 = int(temp_input[3] + temp_input[4] + temp_input[5])
ans = int(temp_input[6] + temp_input[7] + temp_input[8])
if num1 + num2 == ans:
no_answer = False
print(str(num1) + ' + ' + str(num2) + ' = ' + str(ans))
def hard_solve(problem):
split_spot = find_split(problem)
sets = int(len(problem.replace(' ', '').replace('+', '').replace('=', ''))/9)
nums = []
for i in range(1, 10):
for x in range(0, sets):
nums.append(i)
nums_used = problem.replace(' ', '').replace('+', '').replace('=', '').replace('x', '')
[nums.remove(int(i)) for i in nums_used]
no_answer = True
problem = problem.replace(' ', '').replace('+', '').replace('=', '')
while no_answer:
temp_problem = problem[:]
temp_nums = nums[:]
while 'x' in temp_problem:
for i in range(0, len(temp_problem)):
if temp_problem[i] == 'x':
rand_num = random.randrange(0, len(temp_nums))
temp_problem = temp_problem[:i] + str(temp_nums[rand_num]) + temp_problem[i+1:]
temp_nums.remove(temp_nums[rand_num])
sums = [int(temp_problem[i:i+3]) for i in range(0, split_spot, 3)]
temp_problem = temp_problem[split_spot:]
ans = [int(temp_problem[i:i+3]) for i in range(0, len(temp_problem), 3)]
total_sum = 0
for i in sums:
total_sum += i
total_ans = 0
for i in ans:
total_ans += i
if total_ans == total_sum:
no_answer = False
sums_string = ' + '.join(str(i) for i in sums)
ans_string = ' + '.join(str(i) for i in ans)
print(sums_string + " = " + ans_string)
def find_split(problem):
problem = problem.replace(' ', '').replace('+', '')
for i in range(0, len(problem)):
if problem[i] == '=':
return i
start = time.time()
easy_solve('1xx', 'xxx', '468')
easy_solve('xxx', 'x81', '9x4')
easy_solve('xxx', '39x', 'x75')
easy_solve('xxx', '5x1', '86x')
hard_solve('xxx + xxx + 5x3 + 123 = xxx + 795')
hard_solve('xxx + xxx + 23x + 571 = xxx + x82')
hard_solve('xxx + xxx + xx7 + 212 = xxx + 889')
hard_solve('xxx + xxx + 1x6 + 142 = xxx + 553')
hard_solve('xxx + xxx + xxx + x29 + 821 = xxx + xxx + 8xx + 867')
hard_solve('xxx + xxx + xxx + 4x1 + 689 = xxx + xxx + x5x + 957')
hard_solve('xxx + xxx + xxx + 64x + 581 = xxx + xxx + xx2 + 623')
hard_solve('xxx + xxx + xxx + x81 + 759 = xxx + xxx + 8xx + 462')
hard_solve('xxx + xxx + xxx + 6x3 + 299 = xxx + xxx + x8x + 423')
hard_solve('xxx + xxx + xxx + 58x + 561 = xxx + xxx + xx7 + 993')
print("--- %s seconds ---" % (time.time() - start))
aW1wb3J0IHJhbmRvbQppbXBvcnQgdGltZQoKCmRlZiBlYXN5X3NvbHZlKG51bTEsIG51bTIsIGFucyk6CiAgICBudW1zID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICBpbnB1dCA9IChudW0xICsgbnVtMiArIGFucykKICAgIG51bXNfdXNlZCA9IGlucHV0LnJlcGxhY2UoJ3gnLCAnJykKICAgIFtudW1zLnJlbW92ZShpbnQoaSkpIGZvciBpIGluIG51bXNfdXNlZF0KICAgIG5vX2Fuc3dlciA9IFRydWUKICAgIHdoaWxlIG5vX2Fuc3dlcjoKICAgICAgICB0ZW1wX2lucHV0ID0gaW5wdXRbOl0KICAgICAgICB0ZW1wX251bXMgPSBudW1zWzpdCiAgICAgICAgd2hpbGUgJ3gnIGluIHRlbXBfaW5wdXQ6CiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih0ZW1wX2lucHV0KSk6CiAgICAgICAgICAgICAgICBpZiB0ZW1wX2lucHV0W2ldID09ICd4JzoKICAgICAgICAgICAgICAgICAgICByYW5kX251bSA9IHJhbmRvbS5yYW5kcmFuZ2UoMCwgbGVuKHRlbXBfbnVtcykpCiAgICAgICAgICAgICAgICAgICAgdGVtcF9pbnB1dCA9IHRlbXBfaW5wdXRbOmldICsgc3RyKHRlbXBfbnVtc1tyYW5kX251bV0pICsgdGVtcF9pbnB1dFtpKzE6XQogICAgICAgICAgICAgICAgICAgIHRlbXBfbnVtcy5yZW1vdmUodGVtcF9udW1zW3JhbmRfbnVtXSkKICAgICAgICBudW0xID0gaW50KHRlbXBfaW5wdXRbMF0gKyB0ZW1wX2lucHV0WzFdICsgdGVtcF9pbnB1dFsyXSkKICAgICAgICBudW0yID0gaW50KHRlbXBfaW5wdXRbM10gKyB0ZW1wX2lucHV0WzRdICsgdGVtcF9pbnB1dFs1XSkKICAgICAgICBhbnMgPSBpbnQodGVtcF9pbnB1dFs2XSArIHRlbXBfaW5wdXRbN10gKyB0ZW1wX2lucHV0WzhdKQogICAgICAgIGlmIG51bTEgKyBudW0yID09IGFuczoKICAgICAgICAgICAgbm9fYW5zd2VyID0gRmFsc2UKICAgIHByaW50KHN0cihudW0xKSArICcgKyAnICsgc3RyKG51bTIpICsgJyA9ICcgKyBzdHIoYW5zKSkKCgpkZWYgaGFyZF9zb2x2ZShwcm9ibGVtKToKICAgIHNwbGl0X3Nwb3QgPSBmaW5kX3NwbGl0KHByb2JsZW0pCiAgICBzZXRzID0gaW50KGxlbihwcm9ibGVtLnJlcGxhY2UoJyAnLCAnJykucmVwbGFjZSgnKycsICcnKS5yZXBsYWNlKCc9JywgJycpKS85KQogICAgbnVtcyA9IFtdCiAgICBmb3IgaSBpbiByYW5nZSgxLCAxMCk6CiAgICAgICAgZm9yIHggaW4gcmFuZ2UoMCwgc2V0cyk6CiAgICAgICAgICAgIG51bXMuYXBwZW5kKGkpCiAgICBudW1zX3VzZWQgPSBwcm9ibGVtLnJlcGxhY2UoJyAnLCAnJykucmVwbGFjZSgnKycsICcnKS5yZXBsYWNlKCc9JywgJycpLnJlcGxhY2UoJ3gnLCAnJykKICAgIFtudW1zLnJlbW92ZShpbnQoaSkpIGZvciBpIGluIG51bXNfdXNlZF0KICAgIG5vX2Fuc3dlciA9IFRydWUKICAgIHByb2JsZW0gPSBwcm9ibGVtLnJlcGxhY2UoJyAnLCAnJykucmVwbGFjZSgnKycsICcnKS5yZXBsYWNlKCc9JywgJycpCiAgICB3aGlsZSBub19hbnN3ZXI6CiAgICAgICAgdGVtcF9wcm9ibGVtID0gcHJvYmxlbVs6XQogICAgICAgIHRlbXBfbnVtcyA9IG51bXNbOl0KICAgICAgICB3aGlsZSAneCcgaW4gdGVtcF9wcm9ibGVtOgogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4odGVtcF9wcm9ibGVtKSk6CiAgICAgICAgICAgICAgICBpZiB0ZW1wX3Byb2JsZW1baV0gPT0gJ3gnOgogICAgICAgICAgICAgICAgICAgIHJhbmRfbnVtID0gcmFuZG9tLnJhbmRyYW5nZSgwLCBsZW4odGVtcF9udW1zKSkKICAgICAgICAgICAgICAgICAgICB0ZW1wX3Byb2JsZW0gPSB0ZW1wX3Byb2JsZW1bOmldICsgc3RyKHRlbXBfbnVtc1tyYW5kX251bV0pICsgdGVtcF9wcm9ibGVtW2krMTpdCiAgICAgICAgICAgICAgICAgICAgdGVtcF9udW1zLnJlbW92ZSh0ZW1wX251bXNbcmFuZF9udW1dKQogICAgICAgIHN1bXMgPSBbaW50KHRlbXBfcHJvYmxlbVtpOmkrM10pIGZvciBpIGluIHJhbmdlKDAsIHNwbGl0X3Nwb3QsIDMpXQogICAgICAgIHRlbXBfcHJvYmxlbSA9IHRlbXBfcHJvYmxlbVtzcGxpdF9zcG90Ol0KICAgICAgICBhbnMgPSBbaW50KHRlbXBfcHJvYmxlbVtpOmkrM10pIGZvciBpIGluIHJhbmdlKDAsIGxlbih0ZW1wX3Byb2JsZW0pLCAzKV0KICAgICAgICB0b3RhbF9zdW0gPSAwCiAgICAgICAgZm9yIGkgaW4gc3VtczoKICAgICAgICAgICAgdG90YWxfc3VtICs9IGkKICAgICAgICB0b3RhbF9hbnMgPSAwCiAgICAgICAgZm9yIGkgaW4gYW5zOgogICAgICAgICAgICB0b3RhbF9hbnMgKz0gaQogICAgICAgIGlmIHRvdGFsX2FucyA9PSB0b3RhbF9zdW06CiAgICAgICAgICAgIG5vX2Fuc3dlciA9IEZhbHNlCiAgICBzdW1zX3N0cmluZyA9ICcgKyAnLmpvaW4oc3RyKGkpIGZvciBpIGluIHN1bXMpCiAgICBhbnNfc3RyaW5nID0gJyArICcuam9pbihzdHIoaSkgZm9yIGkgaW4gYW5zKQogICAgcHJpbnQoc3Vtc19zdHJpbmcgKyAiID0gIiArIGFuc19zdHJpbmcpCgoKZGVmIGZpbmRfc3BsaXQocHJvYmxlbSk6CiAgICBwcm9ibGVtID0gcHJvYmxlbS5yZXBsYWNlKCcgJywgJycpLnJlcGxhY2UoJysnLCAnJykKICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihwcm9ibGVtKSk6CiAgICAgICAgaWYgcHJvYmxlbVtpXSA9PSAnPSc6CiAgICAgICAgICAgIHJldHVybiBpCgpzdGFydCA9IHRpbWUudGltZSgpCgplYXN5X3NvbHZlKCcxeHgnLCAneHh4JywgJzQ2OCcpCmVhc3lfc29sdmUoJ3h4eCcsICd4ODEnLCAnOXg0JykKZWFzeV9zb2x2ZSgneHh4JywgJzM5eCcsICd4NzUnKQplYXN5X3NvbHZlKCd4eHgnLCAnNXgxJywgJzg2eCcpCmhhcmRfc29sdmUoJ3h4eCArIHh4eCArIDV4MyArIDEyMyA9IHh4eCArIDc5NScpCmhhcmRfc29sdmUoJ3h4eCArIHh4eCArIDIzeCArIDU3MSA9IHh4eCArIHg4MicpCmhhcmRfc29sdmUoJ3h4eCArIHh4eCArIHh4NyArIDIxMiA9IHh4eCArIDg4OScpCmhhcmRfc29sdmUoJ3h4eCArIHh4eCArIDF4NiArIDE0MiA9IHh4eCArIDU1MycpCmhhcmRfc29sdmUoJ3h4eCArIHh4eCArIHh4eCArIHgyOSArIDgyMSA9IHh4eCArIHh4eCArIDh4eCArIDg2NycpCmhhcmRfc29sdmUoJ3h4eCArIHh4eCArIHh4eCArIDR4MSArIDY4OSA9IHh4eCArIHh4eCArIHg1eCArIDk1NycpCmhhcmRfc29sdmUoJ3h4eCArIHh4eCArIHh4eCArIDY0eCArIDU4MSA9IHh4eCArIHh4eCArIHh4MiArIDYyMycpCmhhcmRfc29sdmUoJ3h4eCArIHh4eCArIHh4eCArIHg4MSArIDc1OSA9IHh4eCArIHh4eCArIDh4eCArIDQ2MicpCmhhcmRfc29sdmUoJ3h4eCArIHh4eCArIHh4eCArIDZ4MyArIDI5OSA9IHh4eCArIHh4eCArIHg4eCArIDQyMycpCmhhcmRfc29sdmUoJ3h4eCArIHh4eCArIHh4eCArIDU4eCArIDU2MSA9IHh4eCArIHh4eCArIHh4NyArIDk5MycpCgpwcmludCgiLS0tICVzIHNlY29uZHMgLS0tIiAlICh0aW1lLnRpbWUoKSAtIHN0YXJ0KSk=