Aller au contenu

🧮 Évaluation arithmétique

🧮 On considère ici des arbres syntaxiques d'expression arithmétique simple.

Premier exemple

L'expression A définie avec y + 12 peut être représentée par l'arbre

graph TB
    R("'+'")
    R --> R0("'y'")
    R --> R1("'12'")
🐍 Script Python
A = ['+', [
        ['y', []],
        ['12', []],
    ]

Si on donne la valeur de y, on peut évaluer A.

Par exemple, avec y = 5, on a A évalué en 5 + 12 = 17.

Expression arithmétique simple

Pour simplifier et garder réaliste le problème, on ne considère ici que les expressions mathématiques entre opérandes entières et dont le résultat est entier. On ne considère que quelques opérateurs dans cet exercice.

  • '+' : le plus binaire entre deux opérandes
  • '-' : le moins binaire entre deux opérandes
  • '*' : le multiplication entre deux opérandes
  • '//' : la division entière entre deux opérandes
  • '%' : le reste dans la division entière (le modulo)
  • '**' : la puissance entre deux opérandes, avec exposant positif
  • '+' : le plus unaire qui n'a qu'un opérande
  • '-' : le moins unaire qui n'a qu'un opérande

⚠ Pour cet exercice, il est inutile de connaitre les règles de priorités, elles sont imposées par la construction de l'arbre qui vous est donné. L'objectif est de l'évaluer étant donné un contexte ; un dictionnaire qui donne les valeurs des variables.

Le moins et le plus unaire

  • Dans une expression comme -x+2, le - est unaire, ce n'est pas une soustraction, c'est l'opérateur qui renvoie l'opposé de son opérande.
  • Dans une expression comme 5**+2, le + est unaire, ce n'est pas une addition, c'est l'opérateur qui renvoie son opérande inchangé.

Nœuds de l'arbre

Dans un arbre syntaxique d'expression arithmétique simple, un nœud est :

  • soit un opérateur binaire, il a alors deux sous-arbres : ses opérandes
  • soit un opérateur unaire, il a alors un seul sous-arbres : son opérande
  • soit une variable, il n'a alors aucun sous-arbre
  • soit une valeur entière (sous forme de chaine de caractères), il n'a alors aucun sous-arbre
  • il pourrait y avoir des opérateurs ternaires (ou plus ...) mais pas dans cet exercice 😉

Astuces

  • 👍 Pour reconnaitre un opérateur binaire d'un opérateur unaire, il suffit de regarder le nombre de sous-arbres.
  • 👍 Pour reconnaitre une variable d'une valeur, il suffit de vérifier si c'est une clé du dictionnaire de contexte. On garantit que si ce n'est pas une clé du dictionnaire, alors ce sera une valeur entière.
  • 👍 Pour transformer une chaine de caractères en entier, on peut utiliser la fonction int ; ainsi int('12') renvoie l'entier 12.

Second exemple

graph TB
    R("'*'")
    R --> N1("'+'")
    R --> N2("'//'")
    N1 --> N3("'-'")
    N1 --> N4("'3'")
    N2 --> N5("'b'")
    N2 --> N6("'2'")
    N3 --> N7("'a'")

Cet arbre représente l'expression (-a + 3) * (b // 2).

Avec a = 6 et b = 7, l'évaluation donne -9.

Exercice

Coder une fonction évaluation qui prend en arguments

  • un arbre représentant une expression mathématique simple
  • un dictionnaire contexte qui permet d'associer à une variable une valeur entière.

et qui renvoie l'évaluation de l'expression mathématique suivant ce contexte.

On garantit que l'exposant des puissances sera toujours positif, et ainsi tous les résultats même intermédiaires seront des entiers. On garantit également qu'il n'y aura pas de division par zéro.

👍 Bref, l'exercice est prévu pour un cadre simple, mais généralisable.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : /
.128013]x,59/fq7}8rnb _o=ylae%{pcwgu)*vd4613kRméhtsP(S0+2[-i:050H0w0R0v0#0u0S0p0A0u0v0S0S0s010R0#0z010406050S0D0O0O0v0m0t040V0r0u0D0`0r0n050g111315170 0z04051n1g1q0g1n0 0H0#0G0/0;0?0^0Q0#0C0Q0u1E0Q0R0}050*0o0u0w1z0=0@011D1F1H1F0R1N1P1L0R0m1o0R0Q1R1B010h0,0w0n0v0O0w010/1a0S0z0v0n0^0Y1L1|1~1,1T1/1P1=1@0}0a0p0T0m0r0z0r0S0#1d0n0p0(1`0m0m0w0A2l1g230n1o0g1*2y1%1)1(1M0H250^1H0n1;2i1L1w1y0:1S2I0#2K0n0r2O1L0z2r1o2w2y2$101}2m2Q1-2V0m140u0}0p0K2v2*0~2)242,1T2.2:2=0Y2^1~2`2w2H012 0v2;040p0L332x0 362}0^393b0p0I3f352*373l2=0e3p3h3r3j380r2/3a2=0J3w2{2+1A2~3B303c0j3G3i3J3k3L3D3c0l3P3y3R3A3C3m0f3X2|3Z3t040K0W3(3I2R3!3M0K2@1h2_3x3)3;3+0K323_343{3:2-3T3b0K3e413g3H3s460}0K3o4a3q3|453#4f3v4i434d4m3,3F4p4c3z3~3O4v3Q3}4e3,3W4A3Y4C4s0K3%4G4k3K4s0Y3.4M444O3M0Y3^2$4q4x4D0Y404Y4w3*4#494(4B4l4V4h4-4H4/3U0Y4o4=4N3S4P4u4{4T4}4V4z504r4V4F554!4P4L594*4s0L4R5d4I3M0L4X3`4)5j3U0L4%5n4.4U5q4,5t4?5v3b0L4;5y4|3=5q4`5E515G5B4 5J565q545O5a5k582_1r2!1g2O2B0H1)2G3z0A2W1^1o5!1p5Y2(4i055*0(2#5z0^0M0}0(0h3p5o1-0B2=605u3k0h0}0z0D0#0?1~0A0w655`010|040U6h5F0n0}0v6n5K6k0d3p0p612~0}0o6s376k0E0$6w6x66015|042r0R0D0m1f4i6I6i6p046r6S6y0^0r0}0F0F6w6Z386A3/376L5~6C3z633c6;3*68042Z2W6b0R6^3;6k6m5=6J6V6X2(6J6u6)756,746i6E6G6S0p7j6*6L6N6P6R2$6T6o6q7b6i6#046(6Y7c046B4S6.5}0w5 7e5F6?6x7I5K0n6`0i0D0r0`1;6 7M6D0}73786U7t7W3z7a7z7#7B701-7g6H7r5K7m0)7o7u7s6W7_5K7w0g0g7|3s7d5i1-6/7G7-1T7K88670}0O6}0u0r8b6j7Y8i768i7)7q6*6V7C7!5F7/7i7j7;7E6M7@6Q814x7$8p6J7w0x8D3*835S3Z867H8t5K8a7%6_0}0S0r136g8U718k8#2-8F5W790}6v7*7`8s8+7f0}6F7:8x7l0}7n8C8/7N8*348y3z7w0X8K3}8M428{046:8(89649e8c9c0#0h0h0P2r0n6f8n8%8R827{9h8j048.8G7+8;346*8v9A5F7?6O8~9G909v9L377w0!978)7,4p4Z8L042g0q0o2T0+2r9S1T7w0s9)0^6k0y3w8x933Z0S0K0}006%009r047h9O8E6{6b6d9p8!9t7(8-9;8`6J9^9`0F9}9w6ka02_9?986{2f0H6~9~9z3`9=6*ae04007 aha83Zaj9-6+047Q7S0#7Uasab7kad9_ay0xaB8=8u0}ak928q8d8f8haiaa4pavaP9`0XaT9D8,9 aF6V8X8ZaMa)ac6iax000!a.2x9EaWa=5}9k9m9o9qa%9y6-a9040k3w9W3;8P8i8TaC3}6`0P0G3a0D0v2uba7ZaU9M150o9(baataY7A5*0n0R0w0cbI9~8^a`aOa|2104010N1;0G0raK0p0u00bpbrbt0#1e2n1Qb!bz2r0p111x1~0RbZ1Q1w2tb)0n1=0#b/bGbIbK1^aNam9T0m0v0A2Ta7bx7Xbb8 9u1;0hb?0SaF9+b46W0mbAcc42a*6i6L9ka=0o0}289~bwa/7+cickbMcm0}0s9,cg3z0O0#0}5scEaVa;bO9=c61T0AaQ030p2g9nbt0w6P0p9#b~bB4YcXa{7`0C0v0D0A0Qcsb1a:bD2xcY3k5}2f2kc}6@8HcKcocGbHclcWcu7`0h1eb{1ecJ04cMa19X9Zc.9%d7b2040Z8l8|c9cb9~0bc5dg7=8|8B7palaZ04di9pbubm7.9scda2b$1bb(dlbvdy04c^c`c|a_dpanc1bJbLba0Ed0d87+dVbsdPdTaDdScT9M0Hd5d.dQ1T8odKbF1ec2e1d`8$040E0Ec59b0w1H8Qe56Ucz04cBdZ9w6Vdc0Rdee29.8@dmcLaFcP4f9~aX3gc=bP5Fc!0}c$c(c8bIc,0Dc/d706eGd26K0}cxcN9Xc8ca2Keydoek5Fa}a eDdEeG9b8}dJbE7v0}9ReZand@dXe?c~8?6ld!eseueadRdw8ieB045hf6e30}0bd;eV6Vd,c3cIdfc?dG04eh0Sdua:eE3ceVeJ04c$00a-e/c=e;dIdm96e{9Te}d_d}cecDf07`f49~dx9wfafcfNbdfgcofke9fYd{ecef6J6Lfrftf1fveTe:6Jfyc$bq0m0#0v1O1Q0r0D1`0n0S0*bHeSeU9beYd*c7dAe%fJ9*6?2Tf#e7d-f/cUf;eUdF37f^0pf`f|f~fDcXfF9Je d=7`f$gm6t0}fUevaGe#dBbadDfneHfpf.e.gPgyf@c#g2g4b?g7gpgQ8ze=cyeXbHcCd!gLgegJ6E3G0g5@0w2y2Zg_5Z1x5#2B2E2zf}1P2y5!0 0g0(0*0,0S04.