Lösen Sie die maskierte Addition. Gibt alle möglichen Lösungen aus. Es ist kein Round-Robin-Algorithmus.
In Python geschrieben, denke ich, dass es eine bessere Codierung gibt. Der Algorithmus basiert auf "Die neueste Algorithmus-Enzyklopädie in C-Sprache" von Haruhiko Okumura.
Geben Sie dem Code die Ausführungsberechtigung und geben Sie jede Zeichenfolge der maskierten Berechnung in der Befehlszeile an, z. B. "./fukumen.py MEHR GELD SENDEN".
Link: Qiita: Lösen maskierter Berechnungen (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 Lösung%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("Es gibt keine Lösung.")
exit(0)
$ ./fukumen.py send more money
Lösung 1
9567
1085
-----
10652
$ ./fukumen.py send much money
Lösung 1
8932
1465
-----
10397
Lösung 2
9482
1365
-----
10847
Lösung 3
8935
1462
-----
10397
Lösung 4
9485
1362
-----
10847
Lösung 5
9475
1268
-----
10743
Lösung 6
8635
1729
-----
10364
Lösung 7
9478
1265
-----
10743
Lösung 8
8639
1725
-----
10364
$ ./fukumen.py five seven eleven twelve fifteen twenty seventy
Lösung 1
3209
59094
969094
819609
3238994
819487
-------
5909487
Recommended Posts