C224- Cryptarithmes d’actualité [* à *** à la main, de préférence sans l’aide d’un automate]
CORONA + VIRUS = VAINCU avec VAINCU nombre premier Pierre Leteurtre propose MASQUE + TEST = YENAPAS
Raymond Bloch propose AH + L + EPIDEMIE + PATINE = PHILIPPE Maurice Bauval propose : GUERI + TEST = MASQUE
Michel Lafond propose : H*HYPOXIES(1) = YYYYYYYYY avec * = signe de la multiplication
(1)Hypoxie : manque d’apport en oxygène qui apparaît dans les formes sévères du covid19.
Solutions proposées par Michel Dominique
Pour résoudre les cryptarithmes proposés, un programme en Python a été écrit (voir ci-dessous).
Ce programme liste toutes les solutions possibles (ou aucune les cas échéant).
Ensuite, l'humain prend le relais pour en déduire les solutions qui satisfont aux contraintes de l'énoncé de chaque cryptarithme.
Le choix a été de générer toutes les combinaisons de 10 chiffres sans limiter (alors que certaines restrictions pouvaient être posées a priori,
comme éliminer les nombres avec un 0 comme premier chiffre) Solutions (repérée par ***):
- cryptarithme 1: CORONA + VIRUS = VAINCU avec VAINCU nombre premier Solution :-) CORONA + VIRUS = VAINCU : 659543 + 70918 = 730461
Solution :-) CORONA + VIRUS = VAINCU : 659543 + 72918 = 732461 ***
La première solution est à écarter car on vérifie facilement que le résultat VAINCU est divible par 3 (avec la somme de ses chiffres).
On peut vérifier également que VAINCU est premier dans la seconde solution, c'est donc la solution cherchée.
- cryptarithme 2: GUERI + TEST = MASQUE
Solution :-) GUERI + TEST = MASQUE : 97348 + 5325 = 102673 ***
Solution :-) GUERI + TEST = MASQUE : 59471 + 3423 = 62894 Solution :-) GUERI + TEST = MASQUE : 87641 + 5635 = 93276 Solution :-) GUERI + TEST = MASQUE : 85731 + 6726 = 92457
Seule la première solution est à conserver car pour les autres le M de masque vaut 0, ce qu'on écarte a priori.
- cryptarithme 3: MASQUES + TESTS = YENAPAS Pas de solution :-( MASQUES + TESTS = YENAPAS
- cryptarithme 4: DIX + NEUF = VIRUS, sachant que DIX (contrairement aux apparences) est un nombre impair, NEUF est divisible par 13 et le VIRUS est unique.
16 solutions avec premier chiffre non nul:
Solution :-) DIX + NEUF = VIRUS : 504 + 9872 = 10376 Solution :-) DIX + NEUF = VIRUS : 502 + 9874 = 10376 Solution :-) DIX + NEUF = VIRUS : 603 + 9872 = 10475 Solution :-) DIX + NEUF = VIRUS : 605 + 9832 = 10437 Solution :-) DIX + NEUF = VIRUS : 602 + 9873 = 10475
Solution :-) DIX + NEUF = VIRUS : 602 + 9835 = 10437 Solution :-) DIX + NEUF = VIRUS : 704 + 9832 = 10536 Solution :-) DIX + NEUF = VIRUS : 702 + 9834 = 10536 Solution :-) DIX + NEUF = VIRUS : 804 + 9572 = 10376 Solution :-) DIX + NEUF = VIRUS : 802 + 9574 = 10376 Solution :-) DIX + NEUF = VIRUS : 803 + 9672 = 10475 Solution :-) DIX + NEUF = VIRUS : 805 + 9632 = 10437 Solution :-) DIX + NEUF = VIRUS : 802 + 9673 = 10475 Solution :-) DIX + NEUF = VIRUS : 802 + 9635 = 10437 Solution :-) DIX + NEUF = VIRUS : 804 + 9732 = 10536 Solution :-) DIX + NEUF = VIRUS : 802 + 9734 = 10536
L'énoncé impose que DIX doit être impair, NEUF divisible par 13 et que la valeur de VIRUS doit être unique.
On peut également rajouter que VIRUS ne doit pas commencer par un zéro.
Il reste donc:
Solution :-) DIX + NEUF = VIRUS : 603 + 9872 = 10475 Solution :-) DIX + NEUF = VIRUS : 605 + 9832 = 10437 Solution :-) DIX + NEUF = VIRUS : 803 + 9672 = 10475 ***
Solution :-) DIX + NEUF = VIRUS : 805 + 9632 = 10437
Comme NEUF doit être divisible par 13, la seule solution est la troisième (9672 = 13 * 744):
DIX + NEUF = VIRUS : 803 + 9672 = 10475
- cryptarithme 5: AH + L + EPIDEMIE + PATINE = PHILIPPE
Solution :-) AH + L + EPIDEMIE + PATINE = PHILIPPE : 40 + 2 + 89378638 + 945318 = 90323998
- cryptarithme 6: H*HYPOXIES = YYYYYYYYY avec * = signe de la multiplication Solution :-) H * HYPOXIES = YYYYYYYYY : 9 * 98765432 = 888888888
================================= Programme Python
=================================
"""
Programme pour aider à résoudre les cryptarithmes du problème C224.
Toutes les solutions possibles sont calculées. Ensuite, il suffit d'en extraire les solutions qui satisfont aux contraintes de l'énoncé de chaque crytarithme.
"""
import sys
from itertools import permutations
# Valeurs possibles des lettres valeurs=[i for i in range(10)]
def get_value(v, op):
x = 0
for lettre in op:
x=int(v[lettre])+10*x
return str(x).zfill(len(op))
def solve(res, op1, op2, op3="", op4=""):
# ensemble avec les lettres différentes lettres = sorted(set(op1+op2+op3+op4+res))
print(lettres) if len(lettres) > 10:
sys.exit("Trop de lettres (> 10) !")
def listToDict(lstA, lstB):
zippedLst = zip(lstA, lstB) op = dict(zippedLst) return op
found = False
for val in permutations(valeurs, len(lettres)):
v = listToDict(lettres, val)
r1 = get_value(v, op1) r2 = get_value(v, op2) r3 = get_value(v, op3) r4 = get_value(v, op4) r = get_value(v, res)
if int(r1)+int(r2)+int(r3)+int(r4) == int(r):
found = True
print("Solution :-) ", op1, "+", op2, end='') if op3 != "":
print(" +", op3, end='') if op4 != "":
print(" +", op4, end='')
print(" =", res, ":", r1, "+", r2, end='') if op3 != "":
print(" +", r3, end='') if op4 != "":
print(" +", r4, end='') print(" =", r)
if not found:
print("Pas de solution :-( ", op1, "+", op2, end='') if op3 != "":
print(" +", op3, end='') if op4 != "":
print(" +", op4, end='') print(" =", res)
#=================================================================
if len(sys.argv) < 2:
print("Usage: ", sys.argv[0], " num_jeu (0 for all)") sys.exit("End of game!")
game = sys.argv[1]
if game == "1" or game == "0":
# cryptarithme à résoudre op1 = "CORONA"
op2 = "VIRUS"
res = "VAINCU" # ce nombre doit être premier solve(res,op1,op2)
if game == "2" or game == "0":
# cryptarithme à résoudre op1 = "GUERI"
op2 = "TEST"
res = "MASQUE"
solve(res,op1,op2)
if game == "3" or game == "0":
# cryptarithme à résoudre: a t-il une soluton ? op1 = "MASQUES"
op2 = "TESTS"
res = "YENAPAS"
solve(res,op1,op2)
if game == "4" or game == "0":
# cryptarithme à résoudre
op1 = "DIX" # doit être impair op2 = "NEUF"
res = "VIRUS" # doit être unique solve(res,op1,op2)
if game == "5" or game == "0":
# cryptarithme à résoudre op1 = "AH"
op2 = "L"
op3 = "EPIDEMIE"
op4 = "PATINE"
res = "PHILIPPE"
solve(res,op1,op2,op3,op4)
if game == "6" or game == "0":
def solve_mult(res, op1, op2):
# ensemble avec les lettres différentes lettres = sorted(set(op1+op2+res)) print(lettres)
if len(lettres) > 10:
sys.exit("Trop de lettres (> 10) !")
def listToDict(lstA, lstB):
zippedLst = zip(lstA, lstB) op = dict(zippedLst) return op
found = False
for val in permutations(valeurs, len(lettres)):
v = listToDict(lettres, val)
r1 = get_value(v, op1) r2 = get_value(v, op2) r = get_value(v, res)
if int(r1)*int(r2) == int(r):
found = True
print("Solution :-) ", op1, "*", op2, "=", res, ":", r1, "*", r2, "=", r)
if not found:
print("Pas de solution :-( ", op1, "*", op2, "=", res)
# cryptarithme à résoudre op1 = "H"
op2 = "HYPOXIES"
res = "YYYYYYYYY"
solve_mult(res,op1,op2)