我被這個問題聲明卡住了,我的代碼確實有效,但我使用了排列,這使得它非常緩慢,而且,我不知道如何使它對所有或任何輸入。我認爲我必須使用回溯,但我不使用如何在這裏使用它。Python3:python3中的cryptarithmetic謎題通用解決方案
歡迎任何有價值的建議或建議或代碼。是的,這是一個任務,我不是要求完整的代碼。謝謝!
這裏是問題陳述:
替代不同數字(0,1,2,...,9),用於下面不同的字母,從而使相應的加成是正確的,並且將所得的MONEY值作爲大盡可能。什麼是價值?
SHOW ME + + THE = MONEY
有3個解決方案滿足等式:10376,10267,10265.因此,正確的一個是10376.如果有多個映射評估對相同的最大值時,輸出他們全部。
作業: 用Python編寫一個程序,它總能爲這類問題找到正確的解決方案。
import time
import itertools
def timeit(fn):
def wrapper():
start = time.clock()
ret = fn()
elapsed = time.clock() - start
print("%s took %2.fs" % (fn.__name__, elapsed))
return ret
return wrapper
@timeit
def solve1():
for s in range(1, 10):
for e in range(0, 10):
for n in range(0, 10):
for d in range(0, 10):
for m in range(1, 10):
for o in range(0, 10):
for r in range(0, 10):
for y in range(0, 10):
if distinct(s, e, n, d, m, o, r, y):
send = 1000 * s + 100 * e + 10 * n + d
more = 1000 * m + 100 * o + 10 * r + e
money = 10000 * m + 1000 * o + 100 * n + 10 * e + y
if send + more == money:
return send, more, money
def distinct(*args):
return len(set(args)) == len(args)
@timeit
def solve2():
#letters = input("Enter your string: ")
#letters1 = list(letters)
letters = ('s', 'h', 'o', 'w', 'm', 'e', 't')
digits = range(10)
for perm in itertools.permutations(digits, len(letters)):
sol = dict(zip(letters, perm))
if sol['s'] == 0 or sol['m'] == 0:
continue
send = 1000 * sol['s'] + 100 * sol['e'] + 10 * sol['n'] + sol['d']
more = 1000 * sol['m'] + 100 * sol['o'] + 10 * sol['r'] + sol['e']
money = 10000 * sol['m'] + 1000 * sol['o'] + 100 * sol['n'] + 10 * sol['e'] + sol['y']
if send + more == money:
return send, more, money
print(solve1())
print(solve2())
你只是預期增加作爲輸入或減法或甚至更復雜的方程? – Felix
哦,還有一個問題:你發佈的解決方案是MONEY的映射,對吧?所以10376意味着M = 1,O = 0,...其他字母的映射怎麼樣? – Felix
這不是關於解決你的作業和/或謎題。 – zaph