IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Enquête cluedo-scientifique [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Avril 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2018
    Messages : 5
    Par défaut Enquête cluedo-scientifique
    Bonjour,

    Voici un exercice que j'ai trouvé dans le livre "Python au Lycée" d'Arnaud Bodin chez exo7 :
    Un crime est commis. Il y a 4 suspects. La police scientifique a recueilli les ADN de chacun d'eux et, sur le cadavre, deux bouts de code qui, disent-ils, sont éloignés dans la séquence ADN (je ne sais pas comment ils ont fait mais, ce sont de super scientifiques alors j'ai confiance).
    Moi, en tant qu'enquêteur, je dois trouver le coupable avec tout ça.

    Code 1 : CATA
    Code 2 : ATGC
    ADN du colonel Moutarde :
    CCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGC
    ADN de Mlle Rose :
    CTCCTGATGCTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGG
    ADN de Mme Pervenche :
    AAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGTACTCCGCGCGCCGGGACAGAATGCC
    ADN de M. Leblanc :
    CTGCAGGAACTTCTTCTGGAAGTACTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAG


    J'ai fait un code qui fonctionne, mais c'est une usine à gaz je trouve ; et s'il y avait 100 suspects par exemple, qu'est-ce que ce code prendrait comme place pour un si petit problème !

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    def position(code, sequence):
        """
       Tests if a sequence contains a given code and returns the
    position of the first occurrence.
        
        Input: a code and a DNA sequence
        Output: the position of the beginning of the found code;
            None if does not appear
       
        Example: Position ("CCG", "CTCCGTT") returns 2
        """
     
        if code in sequence:
            for i in range(len(sequence)-len(code)):
                if sequence[i] == code[0]:
                    code_in_sequence = sequence[i : i+len(code)]
                    # TEST print("V_", code_in_sequence)
                    if code_in_sequence == code:
                        return i
     
     
     
    #============ CLUEDO ==========================
     
     
    # Les ADN :
    Moutarde = "CCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGC"
    Rose = "CTCCTGATGCTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGG"
    Pervenche = "AAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGTACTCCGCGCGCCGGGACAGAATGCC"
    Leblanc = "CTGCAGGAACTTCTTCTGGAAGTACTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAG"
     
    # Les codes :
    code1 = "CATA"
    code2 = "ATGC"
     
    # Les suspects :
    suspects = [Moutarde, Rose, Pervenche, Leblanc]
     
    #   Liste dans laquelle se trouvent les éloignements entre les deux
    # "codes coupables" de chacun des intéressés.
    # Si un suspect n'a pas l'un de ces codes, son éloignement sera égal à 0
    eloignements = []
     
     
    #===============================
    #===============================
    # Cette partie du programme trouve les ADN qui possèdent les 2 codes en passant  en
    # revue chacun des suspects. Si la fonction position() renvoie 'None' pour
    # code1, le suspect a son éloignement égal à 0, sinon on passe au code 2 et
    # on fait la même chose que pour code1.
    # Si les 2 codes sont dans la séquence ADN du suspect, alors, leur éloignement
    # est entré dans la liste 'eloignements'.
     
    for i in range(len(suspects)-1):
        resultat1 = position(code1, suspects[i])
        if resultat1 != None:
            resultat2 = position(code2, suspects[i])
            if resultat2 != None:
                if i == 0:
                    eloignementMoutarde = abs(resultat2 - resultat1)
                    fiche = eloignementMoutarde
                elif i == 1:
                    eloignementRose = abs(resultat2 - resultat1)
                    fiche = eloignementRose
                elif i == 2:
                    eloignementPervenche = abs(resultat2 - resultat1)
                    fiche = eloignementPervenche
                elif i == 3:
                    eloignementLeblanc = abs(resultat2 - resultat1)
                    fiche = eloignementLeblanc
                eloignements.append(fiche)
     
            else:
                if i == 0:
                    eloignementMoutarde = 0
                    fiche = eloignementMoutarde
                elif i == 1:
                    eloignementRose = 0
                    fiche = eloignementRose
                elif i == 2:
                    eloignementPervenche = 0
                    fiche = eloignementPervenche
                elif i == 3:
                    eloignementLeblanc = 0
                    fiche = eloignementLeblanc
                eloignements.append(fiche)
        else:
            if i == 0:
                eloignementMoutarde = 0
                fiche = eloignementMoutarde
            elif i == 1:
                eloignementRose = 0
                fiche = eloignementRose
            elif i == 2:
                eloignementPervenche = 0
                fiche = eloignementPervenche
            elif i == 3:
                eloignementLeblanc = 0
                fiche = eloignementLeblanc
            eloignements.append(fiche)
     
     
     
    # Recherche de l'éloignement maxi qui désignera la/le coupable
    Max = max(eloignements)
     
     
     
    # Renvoi de la sentence
    if eloignementMoutarde == Max:
        print("Le colonel Moutarde est le coupable")
    elif eloignementRose == Max:
        print("Mlle Rose est la coupable")
    elif eloignementPervenche == Max:
        print("Mme Pervenche est la coupable")
    elif eloignementLeblanc == Max:
        print("Mr Leblanc est le coupable")
    Je suis sûr que quelqu'un a une solution toute simple, évidente et déprimante qui me fera rougir de honte à l'idée de vous avoir dérangé pour si peu. Mais tant-pis, j'y ai passé trop de temps !

    Merci d'avance...

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    En gros ça a l'air pas mal.

    Tout d'abord for i in range(len(suspects)-1): devrait être for i in range(len(suspects)):. On indexe à partir de zéro.

    Ensuite ta fonction peut être simplifiée en splitant ta chaîne ADN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        if code in sequence:
            begin = sequence.split(code)[0]
            #On retourne l'index du premier caractère du code
            return len(begin)

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par Arnaudettes Voir le message
    Je suis sûr que quelqu'un a une solution toute simple, évidente et déprimante qui me fera rougir de honte à l'idée de vous avoir dérangé pour si peu. Mais tant-pis, j'y ai passé trop de temps !
    Si çà fonctionne, déjà c'est bien.
    Et si on veut faire mieux, difficile de ne pas utiliser des constructions que vous ne connaissez pas encore.
    Un truc comme votre fonction "position" n'a pas lieu d'être si vous connaissez str.find....
    Et la grosse frustration du débutant est de se rendre compte qu'il a écrit bien trop de lignes pour refaire des opérations que Python sait déjà faire en natif...
    Normal, vous n'avez pas encore le réflexe de vous dire "ah si cette construction se répète souvent, il y a peut être une solution standard prête à l'emploi" et d'aller éplucher la documentation pour voir de quoi il en retourne.
    C'est comme çà.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Salut

    Effectivement avoir qui fonctionne c'est déjà un très bon début.
    Pour les pistes d'améliorations, en plus de celles déjà données, je te suggèrerais d'utiliser des dictionnaires (et de te renseigner dessus si tu ne les connais pas, c'est un fondamental).
    Car effectivement si tu avais 100 suspects, ton code serait bien long avec toutes ses variables eloignementSuspect1, eloignementSuspect2, etc jusqu'à 100 et il te faudrait les écrire 1 par 1 ...

    Avec un dictionnaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    eloignements = {}
    eloignements["Moutarde"]=...
    eloignements["Pervanche"]=...
    Et si tu en avais 100, on pourrait imaginer que tu aurais le nom des suspects dans une liste, et tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nom_des_suspects = [ "Moutarde", "Pervanche", ... ]
    eloignements = {}
    for un_suspect in nom_des_suspects :
         eloignements[un_suspect]=...
    Accessoirement le dictionnaire peut t'éviter pas mal de if/elif à ralonge.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    lettre ='c'
    if lettre == 'a' :
       print("A comme Alice")
    elif lettre == 'b' :
       print("B comme Bertrand")
    elif lettre == 'c' :
       print("C comme Charles")
    ...
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lettre = 'c'
    mots_d_exemple = {"a" : "A comme Alice", "b" : "B comme Bertrand", "c": "C comme Charles"}
    print(mots_d_exemple[lettre])

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    et s'il y avait 100 suspects par exemple, qu'est-ce que ce code prendrait comme place pour un si petit problème !
    Dans la logique je répondrai,
    • Tu crées une fonction pour un suspect
    • Tu répètes cette fonction 100 fois dans le code principal


    Dans ton cas ça se tient comme dans la plupart des cas, mais cela s'exprime en code après une étude sur papier bien réfléchie.

  6. #6
    Membre régulier
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Avril 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2018
    Messages : 5
    Par défaut Merci
    Merci à tous pour vos réponses et conseils tous pertinents.
    J'essaierai de les garder en tête afin de devenir un respectable codeur qui connaît les outils mis à sa disposition pour les mettre au service de la solution trouvée grâce à une tournure d'esprit
    créative, astucieuse et souple
    (je me rends compte en lisant vos réponses que cette tournure d'esprit, je ne l'ai pas encore ou en tous cas qu'elle est réduite à quelques mécanismes primaires).

    Bon, ça fait beaucoup de vocabulaire à apprendre, beaucoup de travail pour chambouler un peu ses zones de confort intellectuel en espérant qu'au bout,
    Python deviendra un moyen d'expression naturel.
    Mais je suppose que ça, c'est le lot de tous les débutants...

    Arnaudettes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Enquête cluedo-scientifique
    Par Arnaudettes dans le forum Exercices
    Réponses: 2
    Dernier message: 07/08/2018, 21h03
  2. Enquête sur développeurs professionnel
    Par pucenet dans le forum Structure
    Réponses: 6
    Dernier message: 23/04/2005, 14h53
  3. Langages et applications scientifiques
    Par Whiplash dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 21/02/2005, 21h43
  4. Notation scientifique
    Par Equus dans le forum Débuter
    Réponses: 4
    Dernier message: 03/02/2005, 14h16
  5. Conversion fpu -> notation scientifique décimale
    Par Alucard_Math dans le forum Assembleur
    Réponses: 4
    Dernier message: 13/05/2004, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo