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

Langage Perl Discussion :

modifications multiples dans une séquence


Sujet :

Langage Perl

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut modifications multiples dans une séquence
    Bonjour,


    J'aimerais savoir comment résoudre mon problème de façon la plus optimale possible. Excepté en faisant une série de boucles, je ne vois pas comment faire.

    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
    # Récupérer toutes les combinaisons possibles
    # GtcgggtacggGaat
    # GtcgggtacggTaat
    # AtcgggtacggGaat
    # AtcgggtacggTaat
     
    my $Sequence = "RtcgggtacggKaat";
     
    my %Correspondances =
    (
            'R' => ["G", "A"],
            'K' => ["G", "T"],
            'S' => ["G", "C"],
            'W' => ["A", "T"],
            'M' => ["A", "C"],
            'Y' => ["T", "C"],
            'D' => ["G", "A", "T"],
            'V' => ["G", "A", "C"],
            'B' => ["G", "T", "C"],
            'H' => ["A", "T", "C"],
            'N' => ["A", "T", "C", "G"],
    );
     
    my @CompteDeg = $Sequence =~ /[RKSWMYDVBHN]/ig;
    J'ai donc la séquence RtcgggtacggKaat et j'aimerais remplacer le R et le K par leurs valeurs en récupérant toutes les combinaisons possibles (4 ici).
    # GtcgggtacggGaat
    # GtcgggtacggTaat
    # AtcgggtacggGaat
    # AtcgggtacggTaat

    Merci beaucoup,


    Jasmine,

  2. #2
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Bonjour.

    D'un point de vue algorithmique, je ne vois pas d'autre solution qu'une exploration combinatoire de l'arbre. Personnellement, j'opterais plutôt pour une fonction récursive (sur la séquence), plus facile à penser de mon point de vue.

    Une question ta séquence peut-elle arbitrairement longue (et en l'occurrence très très longue) ? Cela joue à mon avis dans le choix d'une solution optimale.

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Non, elle n'est jamais longue au grand maximum 70 lettres et les lettres dégénérées ne représentent jamais plus du cinquième de la séquence.


    Merci,


    Jasmine,

  4. #4
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    J'ai eu finalement un peu de temps pour regarder ton problème d'un peu plus près.

    Pour être franc, je n'ai pas trouvé de solution récursive évidente. J'avais pensé qu'une réduction récursive de la séquence pour être à la fois économe et élégante. Mais je n'ai pas réussi et j'avoue n'avoir pas trop de temps pour chercher plus avant.

    Voilà qui m'est venu naturellement. L'exploration est redondante, d'où le hash pur le résultat.

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $sequence = "RtcgggtacggKaat";
     
    my %associations =
    (
            'R' => ["G", "A"],
            'K' => ["G", "T"],
            'S' => ["G", "C"],
            'W' => ["A", "T"],
            'M' => ["A", "C"],
            'Y' => ["T", "C"],
            'D' => ["G", "A", "T"],
            'V' => ["G", "A", "C"],
            'B' => ["G", "T", "C"],
            'H' => ["A", "T", "C"],
            'N' => ["A", "T", "C", "G"],
    );
     
    my %result;
     
    sub reduce {
    	my $seq = shift;
    	$result{$seq}++	if ($seq !~ /[RKSWMYDVBHN]/);
    	for my $meta (keys %associations) {
    		next if ($seq !~ /$meta/);
    		for my $base (@{$associations{$meta}}) {
    				my $newseq = $seq; 
    				$newseq =~ s/$meta/$base/; 
    				reduce($newseq);
    		}
    	}
     
    }
     
    reduce($sequence);
    print map {$_."\n"} keys %result;

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Merci beaucoup, cela fonctionne. C'est vraiment ingénieux comme script, je ne pense jamais à faire des fonctions récursives, je vais y remédier à l'avenir. Maintenant que j'ai bien compris comment cela fonctionne, je vais essayer de voir si il n'y a pas moyen de l'améliorer. Bonne journée.



    Jasmine,

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 03/02/2006, 15h15
  2. update multiple dans une meme colonne
    Par debdev dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/01/2006, 21h46
  3. Reconnaître une position dans une séquence d'images
    Par echataig dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 23/01/2006, 17h44
  4. [Débutant] Sélection multiples dans une Listbox
    Par eraim dans le forum Access
    Réponses: 4
    Dernier message: 15/10/2005, 03h21
  5. Enregistre résulat multiplication dans une table
    Par faranfasi dans le forum Access
    Réponses: 2
    Dernier message: 11/10/2005, 13h04

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