Advent of code

 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
   
        
  1. moncode.py
  2. codeReductionEquation.py
  3. 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 :(")