""" Résolution du cryptarithme KILO + KILO = TONNE """ def tous_differents_v1(d): return len(set(d.values())) == len(d) def tous_differents_v2(d): """ Vérifie que les valeurs du dictionnaire d sont toutes différentes """ for k1, v1 in d.items(): for k2, v2 in d.items(): # si les variables sont différentes et que les valeurs sont les mêmes if k1 != k2 and v1 == v2: # retourner False return False # retourner True si toutes les valeurs sont différentes return True def formule_valide(d): """ Vérifie si la formule KILO + KILO = TONNE est valide """ K = d['K'] I = d['I'] L = d['L'] O = d['O'] N = d['N'] E = d['E'] T = d['T'] kilo = K*1000 + I*100 + L*10 + O tonne = T*10000 + O*1000 + N*100 + N*10 + E return 2 * kilo == tonne def recherche_solutions(d,lettres): """ Recherche toutes les solutions pour le cryptarithme KILO + KILO = TONNE d est un dictionnaire qui contient les valeurs des variables lettres est une liste (ou un ensemble) de variables """ if len(lettres) == 0: # si on a assigné une valeur à toutes les variables if tous_differents_v1(d) and formule_valide(d): # si les valeurs sont toutes différentes et que la formule est valide # on a trouvé une solution print(d) else: # sinon on continue la recherche # on choisit une variable k = lettres.pop() # on essaie toutes les valeurs possibles pour cette # variable for i in range(10): # on assigne la valeur i à la variable k d[k] = i # on continue la recherche recherche_solutions(d, lettres) # on remet la variable dans la liste lettres.append(k) def main(): """ Fonction principale """ # chaine de caractères à partir de laquelle on extrait les variables chn = "KILO+KILO=TONNE" # ensemble des variables ens = { car for car in chn if car.isalpha() } # dictionnaire qui contiendra les valeurs des variables dico = { k: 0 for k in ens } # lancer la recherche des solutions recherche_solutions(dico, list(ens)) if __name__ == "__main__": main()