Objectifs

Consignes

Présentation du jeu "le compte est bon"

Créé par Armand Jammot, ce jeu est diffusé pour la première fois le 4 janvier 1972 dans l'émission Des Chiffres et des Lettres. Le but est d'atteindre un nombre cible à l'aide de six nombres outils et des quatre opérations élémentaires. Chaque nombre peut être utilisé une seule fois ou pas du tout.

Modélisation du jeu en Python

Nous allons utiliser un programme Python qui modélise et résout le jeu du compte est bon.

Pour cela, les combinaisons à partir des 6 nombres de départ et des 4 opérations seront modélisées par un arbre binaire.

Suite à l'exécution du script « compteEstBonEleve.py », la variable expressions contient la liste des 2 764 800 combinaisons d'opérations utilisant les 6 nombres de la liste cards. Certaines opérations ne sont pas valides. Nous verrons plus tard comment améliorer ce code mais dans un premier temps, nous allons l’utiliser en l’état comme outil de travail. Ces expressions sont données sous forme d'arbre, comme par exemple :

La valeur de cette expression est : (((1+7)*((100-25)-5))+9) = 569.

Les nœuds de ces arbres sont des instances de la classe Number ou de la classe Operator.

Nœud du type Number

Les nœuds de la classe Number sont les feuilles de l’arbre. La méthode get_value() renvoie la valeur du nœud (un des 6 nombres de la liste cards)

Nœud du type Operator

Tous les autres nœuds sont du type Operator. Ils disposent des méthodes :

isinstance(expression, Operator) renvoie un booléen indiquant si le nœud expression est du type Operator

Les deux classes Number et Operator héritent de la classe Node qui permet de représenter un arbre binaire avec :

Suite à l'exécution du script « compteEstBonEleve.py », la variable expressions contient la liste des 2 764 800 combinaisons d'opérations utilisant les 6 nombres de la liste cards. Certaines opérations ne sont pas valides. Nous verrons plus tard comment améliorer ce code.

Travail sur une des 2 764 800 expressions

Représentation de l’arbre

L’application graphviz permet de représenter graphiquement des arbres : http://www.graphviz.org/ On y accède en Python avec la bibliothèque graphviz : https://pypi.org/project/graphviz/

Ecriture de fonctions

Écrire une fonction eval_expression(expression) qui renvoie la valeur d’une expression. De quel type de parcours s’agit-il ?

Écrire une fonction retourne_expression qui renvoie l’expression sous forme de chaine de caractères : ((10 + 3) × (25 – 8) + 5)

De quel type de parcours s’agit-il ?

Écrire une fonction affiche_calculs(expression) qui détaille les calculs d’une expression, comme le font les participants lors du jeu :

10 + 3 = 13
25 – 8 = 17
13 * 17 = 221
221 + 5 = 226

Écrire une fonction resoudre(expressions, goal) qui va afficher sous forme de chaine toutes les expressions égales à la valeur goal.

Tester la fonction resoudre(). Est-ce que toutes les solutions affichées conviennent ? Proposer, sans les programmer, des pistes pour améliorer le code.

Travail sur les classes

Remplacer la fonction eval_expression() par une méthode eval(self) de la classe Operator. Traiter Les erreurs de divisions par 0

Remplacer la fonction retourne_expression(expression) par une méthode __str__(self) (surcharge de la fonction print()) de la classe Operator permettant un affichage sous forme de chaine de caractères.

Modifier la fonction me_rec(cards, goal) afin de :

Travail sur le solveur du Compte est bon

Modifier la fonction me_rec pour enregistrer uniquement dans la liste expressions les expressions donnant le résultat attendu.

La fonction me_rec(cards, goal) teste-t-elle toutes les expressions possibles ou seulement celles utilisant toutes les cartes ? Modifier cette fonction si besoin pour tester toutes les expressions possibles.

Proposer un compte est bon où il n'est pas possible de trouver "le compte est bon".

Modifier la fonction me_rec(cards, goal) afin qu'elle retourne les expressions correspondant à goal si c'est possible ou à défaut la ou les expressions les plus proches de goal. cartes ? Modifier cette fonction si besoin pour tester toutes les expressions possibles.

Question Bonus : Modifier la fonction me_rec(cards, goal) afin qu'elle retourne l'expression optimale : c'est à dire avec le compte ou bon si c'est possible (ou bien le nombre le plus proche) en utilisant le moins de nombres possibles.


Auteur : Hugues Malherbe, ressource largement inspirée de l'excellente ressource du lycée Louis de Foix