# ========================================================================================= # Problème de logique : qui a le serpent ? # Résolution du problème par force brute # nsi.gecif.net # décembre 2024 # ========================================================================================= """ 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 ? """ from itertools import * # ############################################################################################## # Fonction solution() # ############################################################################################## def solution(tableau): # la fonction solution compare le tableau passé en paramètre à l'énnoncé du problème : # elle renvoie True si le tableau correspond en tout point à la problématique, False dans le cas contraire # ========================================================================================= # CONDITION 1 : # l'anglais vit dans la maison rouge ? Testons les 3 maisons : for i in range(3): # si l'anglais n'est pas dans la maison rouge on retourne False : if tableau[i]['nationalite']=='anglais' and tableau[i]['couleur']!='rouge': return False # ========================================================================================= # CONDITION 2 : # le jaguar est l'animal de l'espagnol ? Testons les 3 maisons : for i in range(3): # si le jaguar n'est pas dans avec l'espagnol on retourne False : if tableau[i]['animal']=='jaguar' and tableau[i]['nationalite']!='espagnol': return False # ========================================================================================= # CONDITION 3 : # le japonais vit à droite de la maison du possesseur de l'escargot # cherchons la position de la maison contenant le japonais : for i in range(3): if tableau[i]['nationalite']=='japonais': position_japonais=i # cherchons la position de la maison contenant l'escargot : for i in range(3): if tableau[i]['animal']=='escargot': position_escargot=i # testons la position relative de ces 2 maisons : if position_japonais<=position_escargot: return False # ========================================================================================= # CONDITION 4 : # le possesseur de l'escargot vit à gauche de la maison bleue # cherchons la position de la maison bleue : for i in range(3): if tableau[i]['couleur']=='bleue': position_bleue=i # cherchons la position de la maison contenant l'escargot : for i in range(3): if tableau[i]['animal']=='escargot': position_escargot=i # testons la position relative de ces 2 maisons : if position_bleue<=position_escargot: return False # On retourne True si on a "échapé" aux tests précédents, c'est-à-dire si les 4 conditions sont vérifiées : return True # ############################################################################################## # Programme principal # ############################################################################################## # la structure de données utilisée ici est une liste de dictionnaires : # - les 3 maisons sont dans une liste à 3 éléments (avec la notion d'ordre) # - la liste contient 3 dictionnaires dont les clés sont couleur, nationalite et animal # on crée la liste vide : liste_maisons=[{'couleur':None,'nationalite':None,'animal':None},{'couleur':None,'nationalite':None,'animal':None},{'couleur':None,'nationalite':None,'animal':None}] liste_couleur=['rouge','bleue','verte'] liste_nationalite=['anglais','espagnol','japonais'] liste_animal=['jaguar','escargot','serpent'] tous_les_cas_couleur=list(permutations(liste_couleur)) tous_les_cas_nationalite=list(permutations(liste_nationalite)) tous_les_cas_animal=list(permutations(liste_animal)) solutions_testees=0 solutions_trouvees=0 for t_couleur in tous_les_cas_couleur: for t_nationalite in tous_les_cas_nationalite: for t_animal in tous_les_cas_animal: # on remplit les 3 maisons for i in range(3): liste_maisons[i]['couleur']=t_couleur[i] liste_maisons[i]['nationalite']=t_nationalite[i] liste_maisons[i]['animal']=t_animal[i] # on teste cette solution : if solution(liste_maisons): solutions_trouvees=solutions_trouvees+1 print('\nSolution n°%d trouvée :' % solutions_trouvees) print('Maison 1 : ',liste_maisons[0]) print('Maison 2 : ',liste_maisons[1]) print('Maison 3 : ',liste_maisons[2]) # on compte le nombre de solution testées : solutions_testees=solutions_testees+1 print('\nLe programme a testé par force brute %d solutions différentes et en a trouvé %d correctes.' % (solutions_testees,solutions_trouvees)) # La problématique à résoudre était : Qui possède le serpent ? # On remarque que dans les 5 solutions resorties par Python c'est le japonais qui possède le serpent. # Sur les 5 soluions : le japonais est 3 fois dans la maison bleue et 2 fois dans la maison verte.