• # python rebelle

    Posté par . En réponse au message Avent du Code, jour 21. Évalué à 3. Dernière modification le 21 décembre 2022 à 21:15.

    On voulait me faire faire un AST et évaluer le bazar. Bah je voulais pas.
    Du coup j'ai fait une boucle infinie jusqu'à tout évaluer.
    Ça m'a permis de faire la partie 1 en quelques minutes.

    Bon je l'ai un peu payé sur la partie 2, j'ai dû bidouiller. La vizu m'a permis de voir qu'il n'y a pas de lien entre les deux branches partant de root. Donc pas de réutilisation d'un résultat dans les deux sous arbres. Donc l'inconnu n'est impliqué que dans une seule équation. J'ai donc hardcodé a valeur du sous arbre de droite dans la racine du sous arbre de gauche, là où se situe "humn".

    Chaque partie s'évalue en 0.30s et 10Mo de RAM.

    part 1

    import sys
    N = dict() # numbers
    E = dict() # expressions
    for l in sys.stdin.read().splitlines():
     k, v = l.split(":")
     v = v.strip()
     if v.isdigit():
     N[k]=int(v)
     else:
     w = v.split(" ")
     E[k]=w
    O = {
     '*': lambda x,y: x*y,
     '+': lambda x,y: x+y,
     '-': lambda x,y: x-y,
     '/': lambda x,y: x/y,
    }
    while len(E)>0:
     D = dict()
     for k,v in E.items():
     (a,o,b) = v
     if a in N and b in N:
     N[k] = O[o](N[a],N[b])
     else:
     D[k] = v
     E = D
    print(N["root"])

    part 2

    import sys
    N = dict()
    E = list()
    I = {"+":"-","-":"+","*":"/","/":"*"}
    for l in sys.stdin.read().splitlines():
     k, v = l.split(":")
     v = v.strip()
     if v.isdigit():
     N[k]=int(v)
     else:
     (a,o,b) = v.split(" ")
     E.append((k,a,o,b))
     if o in {"+","*"}:
     E.append((a,k,I[o],b))
     E.append((b,k,I[o],a))
     else:
     E.append((a,k,I[o],b))
     E.append((b,a,o,k))
    if len(N)<100:
     N["pppw"] = 150
    else:
     N["qmfl"] = 54426117311903
     N["qdpj"] = 54426117311903
    del N["humn"]
    O = {
     '/': lambda x,y: x/y,
     '-': lambda x,y: x-y,
     '+': lambda x,y: x+y,
     '*': lambda x,y: x*y,
    }
    while len(E)>0:
     D = list()
     for (k,a,o,b) in E:
     if a in N and b in N:
     N[k] = O[o](N[a],N[b])
     if k == "humn":
     print(N[k])
     D = {}
     break
     else:
     D.append((k,a,o,b))
     E = D