# =================================== # Résolution d'un problème logique par force brute # nsi.gecif.net # décembre 2024 # =================================== """ PROBLEME : qui a le serpent ? Énoncé du problème : Dans une rue 3 maisons voisines sont de couleurs différentes : rouge, bleue et verte. Des personnes de nationalités différentes vivent dans ces maisons et elles ont chacune un animal de compagnie différent. Les données du problème sont : - l'anglais vit dans la maison rouge - le jaguar est l'animal de l'espagnol - le japonais vit à droite de la maison du possesseur de l'escargot - le possesseur de l'escargot vit à gauche de la maison bleue La problématique à résoudre est : Qui possède le serpent ? =================================================================================== Quelle structure de données en Python peut-on utiliser pour traduire le problème ? La difficulté ici est la notion d'ordre, traduisant "vit à droite de" ou "vit à gauche". Pour résoudre ce problème on peut transformer les onditions : - le japonais vit à droite de la maison du possesseur de l'escargot revient à dire que "l'escargot ne peut pas être dans la maison de droite" - le possesseur de l'escargot vit à gauche de la maison bleue revient à dire que "la maison bleue ne peut pas être la maison de gauche" Comme les 3 maisons sont ordonnées (maison 1, maison 2 et maison 3) elles seront les élements d'une liste. Il faut associer à chaque maison 3 éléments : une couleur, une nationalité et un animal. Les maisons seront des dictionnaires ordonnés dans une liste et possédant 3 clés : couleur, nationalite et animal. Nous avon donc une liste de 3 dictionnaires (3 maisons) contenant chacun 3 clés (couleur, nationalite et animal). - les 3 couleurs sont : rouge, bleue et verte - les 3 nationalités sont : anglais, espagnol et japonais - les 3 animaux sont : jaguar, escargot et serpent - les maisons seront des dictionnaires contenant chacun 3 clés : couleur, nationalite et animal - les couleurs seront le contenu des clés 'couleur' (3 chaînes de caractères 'rouge','bleue' et 'verte') - les nationalités seront le contenu des clés 'nationalite' (3 chaînes de caractères 'anglais','espagnol' et 'japonais') - les animaux seront le contenu des clés 'animal' (3 chaînes de caractères 'jaguar','escargot' et 'serpent') En associant tous les cas possibles aux 3 clés des 3 dictionnaires il faut trouver la seule combinaison qui réponde au problème. """ from itertools import * # on crée la liste de 3 dictionnaires représentant les 3 maisons (contenant None pour l'instant pour chaque valeur) : # la première maison à gauche est liste_maison[0] # la maison du milieu est liste_maison[1] # la maison de droite est liste_maison[2] liste_maison=[{'couleur':None,'nationalite':None,'animal':None},{'couleur':None,'nationalite':None,'animal':None},{'couleur':None,'nationalite':None,'animal':None}] # on crée les listes des couleurs, des nationalités et des animaux : liste_couleur=['rouge','bleue','verte'] liste_nationalite=['anglais','espagnol','japonais'] liste_animal=['jaguar','escargot','serpent'] # on crée toutes les permutations possibles des 3 listes : tous_les_cas_couleur=list(permutations(liste_couleur)) tous_les_cas_nationalite=list(permutations(liste_nationalite)) tous_les_cas_animal=list(permutations(liste_animal)) # on teste tous les cas possibles dans 3 boucles for imbriquées : for test_couleur in tous_les_cas_couleur: for test_nationalite in tous_les_cas_nationalite: for test_animal in tous_les_cas_animal: # on attibut une couleur, une nationalité et un animal à chaque maison : # la maison de gauche : liste_maison[0]['couleur']=test_couleur[0] liste_maison[0]['nationalite']=test_nationalite[0] liste_maison[0]['animal']=test_animal[0] # la maison du milieu : liste_maison[1]['couleur']=test_couleur[1] liste_maison[1]['nationalite']=test_nationalite[1] liste_maison[1]['animal']=test_animal[1] # la maison de droite : liste_maison[2]['couleur']=test_couleur[2] liste_maison[2]['nationalite']=test_nationalite[2] liste_maison[2]['animal']=test_animal[2] # condition logique traduisant les données du problème et détectant la bonne solution : # l'anglais vit dans la maison rouge : liste_maison[0]['couleur']=='rouge' and liste_maison[0]['nationalite']=='anglais' or liste_maison[1]['couleur']=='rouge' and liste_maison[1]['nationalite']=='anglais' or liste_maison[2]['couleur']=='rouge' and liste_maison[2]['nationalite']=='anglais' # le jaguar est l'animal de l'espagnol : liste_maison[0]['animal']=='jaguar' and liste_maison[0]['nationalite']=='espagnol' or liste_maison[1]['animal']=='jaguar' and liste_maison[1]['nationalite']=='espagnol' or liste_maison[2]['animal']=='jaguar' and liste_maison[2]['nationalite']=='espagnol' # le japonais vit à droite de la maison du possesseur de l'escargot : liste_maison[1]['nationalite']=='japonais' and liste_maison[0]['animal']=='escargot' or liste_maison[2]['nationalite']=='japonais' and liste_maison[1]['animal']=='escargot' # le possesseur de l'escargot vit à gauche de la maison bleue : liste_maison[1]['couleur']=='bleue' and liste_maison[0]['animal']=='escargot' or liste_maison[2]['couleur']=='bleue' and liste_maison[1]['animal']=='escargot' if ((liste_maison[0]['couleur']=='rouge' and liste_maison[0]['nationalite']=='anglais' or liste_maison[1]['couleur']=='rouge' and liste_maison[1]['nationalite']=='anglais' or liste_maison[2]['couleur']=='rouge' and liste_maison[2]['nationalite']=='anglais')\ and (liste_maison[0]['animal']=='jaguar' and liste_maison[0]['nationalite']=='espagnol' or liste_maison[1]['animal']=='jaguar' and liste_maison[1]['nationalite']=='espagnol' or liste_maison[2]['animal']=='jaguar' and liste_maison[2]['nationalite']=='espagnol')\ and (liste_maison[1]['nationalite']=='japonais' and liste_maison[0]['animal']=='escargot' or liste_maison[2]['nationalite']=='japonais' and liste_maison[1]['animal']=='escargot')\ and (liste_maison[1]['couleur']=='bleue' and liste_maison[0]['animal']=='escargot' or liste_maison[2]['couleur']=='bleue' and liste_maison[1]['animal']=='escargot')): print('Maison 1 : \t couleur -> %s \t nationalite -> %s \t animal -> %s' % (liste_maison[0]['couleur'],liste_maison[0]['nationalite'],liste_maison[0]['animal'])) print('Maison 2 : \t couleur -> %s \t nationalite -> %s \t animal -> %s' % (liste_maison[1]['couleur'],liste_maison[1]['nationalite'],liste_maison[1]['animal'])) print('Maison 3 : \t couleur -> %s \t nationalite -> %s \t animal -> %s\n' % (liste_maison[2]['couleur'],liste_maison[2]['nationalite'],liste_maison[2]['animal']))