# ========================================================================================= # Problème de logique : les 5 sportifs chez le médecin # Résolution du problème par force brute # Programme à compléter en remplaçant les 12 "if False:" par une condition logiques # Le programme teste 1728000 solutions différentes (1.7 million) mais une seule est juste # nsi.gecif.net # Décembre 2024 # ========================================================================================= """ L'énoncé du problème est le suivant : Cinq sportifs sont dans la salle d'attente d'un médecin spécialisé. Retrouvez grâce aux indications suivantes leur ordre d'arrivée, le sport pratiqué par chacun ainsi que la raison médicale de leur présence (le motif de consultation). - Jean qui est arrivé en dernier, ne pratique ni la gymnastique ni le basket. Il ne vient pas se faire établir un certificat - Christian, venu pour un soin, ne pratique pas non plus la gymnastique - Grégoire, qui est arrivé avant Laurent mais après celui qui pratique la gymnastique fait du patinage. Il n'est venu ni pour un certificat, ni chercher un renouvellement d'ordonnance - Celui qui pratique le football est arrivé le troisième, avant Christian. Il est venu chercher une dispense - Remi est un sportif, le rugby est un sport, et la visite est un motif de consultation """ 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 """ En décortiquant l'énoncé on obtient 12 conditions simples : 1 - Jean est arrivé en dernier 2 - Jean ne pratique ni la gymnastique ni le basket 3 - Jean ne vient pas se faire établir un certificat 4 - Christian vient pour un soin 5 - Christian ne pratique pas la gymnastique 6 - Grégoire est arrivé avant Laurent 7 - Grégoire est arrivé après celui qui pratique la gymnastique 8 - Grégoire fait du patinage 9 - Grégoire n'est venu ni pour un certificat, ni chercher un renouvellement d'ordonnance 10 - Le troisième pratique le football 11 - Le troisième est arrivé avant Christian 12 - Le troisième est venu chercher une dispense """ # ========================================================================================= # CONDITION 1 : # Jean est arrivé en dernier for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 2 : # Jean ne pratique ni la gymnastique ni le basket for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 3 : # Jean ne vient pas se faire établir un certificat for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 4 : # Christian vient pour un soin for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 5 : # Christian ne pratique pas la gymnastique for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 6 : # Grégoire est arrivé avant Laurent for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 7 : # Grégoire est arrivé après celui qui pratique la gymnastique for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 8 : # Grégoire fait du patinage for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 9 : # Grégoire n'est venu ni pour un certificat, ni chercher un renouvellement d'ordonnance for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 10 : # Le troisième pratique le football for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 11 : # Le troisième est arrivé avant Christian for i in range(1,6): if False: return False # ========================================================================================= # CONDITION 12 : # Le troisième est venu chercher une dispense for i in range(1,6): if False: 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 5 sportifs sont dans une liste à 6 éléments dont seuls les éléments 1 à 5 sont utilisés # - la liste permet d'avoir la notion d'ordre # - la liste contient 5 dictionnaires dont les 3 clés sont prenom, sport et motif # on crée la liste contenant 5 dictionnaires vides pour l'instant : # liste_sportifs[0] n'est pas utilisé et vaut None # sportif 1 : liste_sportifs[1] (sportif arrivé en premier) # sportif 2 : liste_sportifs[2] # sportif 3 : liste_sportifs[3] # sportif 4 : liste_sportifs[4] # sportif 5 : liste_sportifs[5] (sportif arrivé en dernnier) liste_sportifs=[None,\ {'prenom':None,'sport':None,'motif':None},\ {'prenom':None,'sport':None,'motif':None},\ {'prenom':None,'sport':None,'motif':None},\ {'prenom':None,'sport':None,'motif':None},\ {'prenom':None,'sport':None,'motif':None}] # liste des 5 prénoms : liste_prenom=['jean','christian','gregoire','laurent','remi'] # liste des 5 sports : liste_sport=['gymnastique','basket','patinage','football','rugby'] # liste des 5 motifs de consultation : liste_motif=['certificat','soin','ordonnance','dispense','visite'] tous_les_cas_prenom=list(permutations(liste_prenom)) tous_les_cas_sport=list(permutations(liste_sport)) tous_les_cas_motif=list(permutations(liste_motif)) solutions_testees=0 solutions_trouvees=0 for t_prenom in tous_les_cas_prenom: for t_sport in tous_les_cas_sport: for t_motif in tous_les_cas_motif: # on remplit les 5 dictionnaires for i in range(1,5+1): liste_sportifs[i]['prenom']=t_prenom[i-1] liste_sportifs[i]['sport']=t_sport[i-1] liste_sportifs[i]['motif']=t_motif[i-1] # on teste cette solution : if solution(liste_sportifs): solutions_trouvees=solutions_trouvees+1 print('Solution n°%d trouvée :' % solutions_trouvees) for i in range(1,6): # affiche les solutions trouvées par le programme : print(liste_sportifs[i]) # 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)) """ Voici la solution attendue du problème (peu importe l'ordre des clés dans les dictionnaires) : {'motif': 'certificat', 'sport': 'gymnastique', 'prenom': 'remi'} {'motif': 'visite', 'sport': 'patinage', 'prenom': 'gregoire'} {'motif': 'dispense', 'sport': 'football', 'prenom': 'laurent'} {'motif': 'soin', 'sport': 'basket', 'prenom': 'christian'} {'motif': 'ordonnance', 'sport': 'rugby', 'prenom': 'jean'} Solution donnée par Prolog : sportif(remi,gymnastique,certificat) sportif(gregoire,patinage,visite) sportif(laurent,football,dispense) sportif(christian,basket,soin) sportif(jean,rugby,ordonnance) """