Résolvez le calcul masqué de l'addition. Sort toutes les solutions possibles. Ce n'est pas un algorithme à tour de rôle.
Ecrit en python, je pense qu'il y a un meilleur codage. L'algorithme est basé sur "La dernière encyclopédie des algorithmes en langage C" de Haruhiko Okumura.
Donnez l'autorisation d'exécution du code et spécifiez chaque chaîne de caractères du calcul masqué sur la ligne de commande, par exemple, ./fukumen.py ENVOYER PLUS D'ARGENT
.
Lien: Qiita: résoudre des calculs masqués (Ruby / Python Recreation)
fukumen.py
#!/usr/bin/python3
import sys
N = 128
s = "0123456789ABCDEFGHIJKLMNOPQRTSUVWXYZ"
word = [['' for i in range(N)] for j in range(128)]
digit = [0 for i in range(len(s))]
l = [0 for i in range(len(s))]
ok = [False for i in range(10)]
ii = 0
jj = 0
carry = 0
solution = 0
def found():
global solution
solution += 1
print("\n solution%d" % solution)
for i in range(imax):
if (i == imax-1):
print("-"*jmax)
for j in range(jmax):
k = jmax-1-j
c = word[i][k]
if (c == ''):
print(" ", end="")
else:
print("%d" % digit[s.index(c)], end='')
print("")
def tr(sum):
global ii, jj
w = word[ii][jj]
c = 0 if w == '' else s.index(w)
if (ii < imax-1):
ii += 1
d = digit[c]
if (d < 0):
d = l[c]
while(d <= 9):
if (ok[d]):
digit[c] = d
ok[d] = False
tr(sum+d)
ok[d] = True
d += 1
digit[c] = -1
else:
tr(sum+d)
ii -= 1
else:
jj += 1
ii = 0
carry, d = divmod(sum, 10)
if (digit[c] == d):
if (jj < jmax):
tr(carry)
elif (carry == 0):
found()
else:
if (digit[c] < 0 and ok[d] and d >= l[c]):
digit[c] = d
ok[d] = False
if (jj < jmax):
tr(carry)
elif (carry == 0):
found()
digit[c] = -1
ok[d] = True
jj -= 1
ii = imax-1
argv = sys.argv
argv.pop(0)
imax = len(argv)
jmax = max(map(len, argv))
for i in range(imax):
argv[i] = argv[i].upper()
l[s.index(argv[i][0])] = 1
a = argv[i][-1::-1]
for j in range(len(a)):
word[i][j] = a[j]
c = word[i][j]
if (c.isalpha()):
digit[s.index(c)] = -1
elif (c.isdigit()):
digit[s.index(c)] = int(c)
else:
print("Invalid parameter.")
exit(1)
for i in range(10):
ok[i] = True
tr(0)
if (solution == 0):
print("Il n'y a pas de solution.")
exit(0)
$ ./fukumen.py send more money
Solution 1
9567
1085
-----
10652
$ ./fukumen.py send much money
Solution 1
8932
1465
-----
10397
Solution 2
9482
1365
-----
10847
Solution 3
8935
1462
-----
10397
Solution 4
9485
1362
-----
10847
Solution 5
9475
1268
-----
10743
Solution 6
8635
1729
-----
10364
Solution 7
9478
1265
-----
10743
Solution 8
8639
1725
-----
10364
$ ./fukumen.py five seven eleven twelve fifteen twenty seventy
Solution 1
3209
59094
969094
819609
3238994
819487
-------
5909487
Recommended Posts