[PYTHON] Résoudre le calcul du masque

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)

Exemple d'exécution

$ ./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

Résoudre le calcul du masque
Résolvez le problème de Monty Hall
Résoudre le retard d'observation de l'interféromètre
Résolution de calculs masqués (recréation Ruby / Python)
Résolvons le portefeuille avec une optimisation continue
Comment résoudre le problème d'emballage du bac
Résolvez le problème maximum de sous-tableau en Python