# ========================================================================================= # Problème de logique : qui a le serpent ? # Version améliorée du problème avec 2 conditions suplémentaires afin d'avoir une solution unique # Résolution du problème par force brute # Décembre 2024 # nsi.gecif.net # ========================================================================================= """ 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 initial (qui donne 5 solutions) 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 Nouvelles conditions afin d'avoir une seule solution : • l'espagnol n'habite pas dans la maison verte • l'anglais et le japonais sont voisins 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 # ========================================================================================= # Nouvelle condition # CONDITION 5 : l'espagnol n'habite pas dans la maison verte for i in range(3): # si l'espagnol est dans la maison verte on retourne False : if tableau[i]['nationalite']=='espagnol' and tableau[i]['couleur']=='verte': return False # ========================================================================================= # Nouvelle condition # CONDITION 6 : l'anglais et le japonais sont voisins (dont un des deux habite forcément la maison du milieu) if tableau[1]['nationalite']!='anglais' and tableau[1]['nationalite']!='japonais': return False # On retourne True si on a "échapé" aux tests précédents, c'est-à-dire si les 6 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('Solution 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 correcte(s).' % (solutions_testees,solutions_trouvees)) # La problématique à résoudre était : Qui possède le serpent ? # Dans cette version améliorée du problème on a ajouté 2 nouvelle condition afin qu'il n'y ait qu'une seule manière de remplir le tableau. # On remarque que dans l'unique solution resortie par Python c'est bien le japonais qui possède le serpent.