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:
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...