◂ 21 décembre 2022 ▸
Monkey Math : Calculer une expression mathématique, puis en résoudre une autre
vbjj: fcml * mwwn
mbmw: 2
gstw: cldd / rvtn
brsc: 5
bpjn: 11
⋮
- moncode.py
- codeReductionEquation.py
- calcul.py
### Résolution partie 2, méthode 4, avec réduction de l'équation obtenue
print("====== Partie 2, (4) méthode de résolution par réduction de l'équation, et résolution si forme a+bx, avec a ou b fraction =======")
from calcul import calcul # classe maison représentant des expressions algébriques +-*/ avec des inconnues possibles
f = open("input.txt", 'r')
lines = [line[:-1] for line in f.readlines()]
SILLY_MONKEY = 'root'
MONKEY_ME = 'humn'
monkeys = {}
for line in lines:
tk = line.split()
monkeyName = tk[0][:-1]
# On stocke soit la valeur, soit les trois parties de l'opération. Pas terrible de mélanger les types, mais voilà:
if len(tk) == 2:
monkeys[monkeyName] = int(tk[1])
else:
monkeys[monkeyName] = tk[1:]
monkeys[SILLY_MONKEY][1] = '-' # égalité si ça retourne 0 !
monkeys[MONKEY_ME] = 'x'
def makeCalcul(m):
global monkeys
donnee = monkeys[m]
if type(donnee) == int or type(donnee) == str:
return calcul(donnee)
else:
m1, operation, m2 = donnee
return calcul([makeCalcul(m1), operation, makeCalcul(m2)])
equNonRed = makeCalcul(SILLY_MONKEY)
equRed = equNonRed.reduire()
print("Équation non réduite:", str(equNonRed) + "=0" + "\n")
print("Équation réduite:", str(equRed) + "=0")
# Tentative de résolution si forme a/b ± c/d·x ou a/b ± (c/d)/x
reussi = False
if equRed.type in ['+', '-']:
if equRed.m1.isNum() and equRed.m2.type == 'x':
reussi = True
if equRed.type == '+':
print("x=", calcul([-1, '*', equRed.m1]).reduire())
else:
print("x=", equRed.m1)
elif equRed.m2.m2.type == 'x' and equRed.m2.type in ['*', '/']:
reussi = True
signe = (equRed.type == '+' and -1 or 1)
if equRed.m2.type == '*':
print("x=", calcul( [[signe, '*', equRed.m1], '/', equRed.m2.m1] ).reduire())
else:
print("x=", calcul( [equRed.m2.m1, '/', [signe, '*', equRed.m1]] ).reduire())
elif equRed.m2.m1.type == 'x' and equRed.m2.type == '/':
reussi = True
signe = (equRed.type == '+' and -1 or 1)
print("x=", calcul( [[signe, '*', equRed.m1], '*', equRed.m2.m2] ).reduire())
if not reussi:
print("Pas de résolution automatique possible :(")