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 :

algo sur suite : elements qui se suivent


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut algo sur suite : elements qui se suivent
    bonjour

    Je désire un "compteur" sur les éléments (True) qui se suivent, par exemple :
    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
    1 1 0 1 1 0 1 0 1 1 1
    a a 0 b b 0 0 0 c c c    # je dois trouver
     
    1 0 1 1 0 1 0 1 1 1 1
    0 0 a a 0 0 0 b b b b    # je dois trouver
     
     
    1 0 1 1 0 1 0 1 1 0 1
    0 0 a a 0 0 0 b b 0 0    # je dois trouver
     
    0 1 1 0 1 0 1 1 0 1 0
    0 a a 0 0 0 b b 0 0 0    # je dois trouver
     
    0 1 1 0 1 0 0 1 1 1 0
    0 a a 0 0 0 0 b b b 0    # je dois trouver
    Ici, j'ai utilisé "abc" pour plus de clarté dans "l'énoncé", mais dans mon code test, j'ai utilisé un simple nombre.

    Je pense qui je ne suis pas loin de trouver une solution, mais le code me pique déjà les yeux (donc pas envie d'ajouter des if...). Peut-être qu'il existe une solution pythonnesque ? j'ai regardé du coté de itertools, mais ne l'utilisant jamais, je ne pense pas que mon bonheur y soit.

    A noter qu'il n'y a pas de notion de performance, max : 36 listes de 64 objets

    Code de mon test
    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
     
    datas = [
        [1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1],
        [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1],
        [1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1],
        [0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0],
        [0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0],
    ]
    ok = [
        [1, 1, 0, 2, 2, 0, 0, 0, 3, 3, 3],
        [0, 0, 1, 1, 0, 0, 0, 2, 2, 2, 2],
        [0, 0, 1, 1, 0, 0, 0, 2, 2, 0, 0],
        [0, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0],
        [0, 1, 1, 0, 0, 0, 0, 2, 2, 2, 0],
    ]
     
    def horizontal(data: list) -> list:
        results = [0] * len(data)
        level = 0
        for i, value in enumerate(data):
            if not value:
                level += 1
            else:
                try:
                    prev = data[i - 1]
                except IndexError:  # i==0
                    prev = 0
                try:
                    after = data[i + 1]
                except IndexError:  # dernier liste
                    after = 0
                    pass
                if prev or after:  # 2 de suite
                    results[i] = level
                else:
                    if level > 0:
                        level -= 1
     
        return results
     
     
    if __name__ == "__main__":
        for y, line in enumerate(datas):
            results = horizontal(line)
            print("> ", line)
            print("  ", results, ok[y] == results)
            if ok[y] != results:
                print("# ", ok[y])
            print()
    résultat actuel:
    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
     
    >  [1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1]
       [0, 0, 0, 1, 1, 0, 0, 0, 2, 2, 2] False
    #  [1, 1, 0, 2, 2, 0, 0, 0, 3, 3, 3]
     
    >  [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1]
       [0, 0, 1, 1, 0, 0, 0, 2, 2, 2, 2] True
     
    >  [1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1]
       [0, 0, 1, 1, 0, 0, 0, 2, 2, 0, 0] True
     
    >  [0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0]
       [0, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0] True
     
    >  [0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0]
       [0, 1, 1, 0, 0, 0, 0, 3, 3, 3, 0] False
    #  [0, 1, 1, 0, 0, 0, 0, 2, 2, 2, 0]

    EDIT:
    trouvé une solution (que des True en sortie) et surtout plus de if else: En fait, sauvegarder les index puis faire un split (maison)

    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
    def split_at_indices(lst, indices):
        results = []
        prev_index = 0
        for index in indices:
            results.append(lst[prev_index:index])
            prev_index = index + 1
        results.append(lst[prev_index:])
        return results
     
     
    def horizontal(data: list) -> list:
        # sauve les index
        paired = list(zip(range(len(data)), data))
        indices = [x[0] for x in paired if x[1] == 0]
        # split et supprime les sequences trop courtes
        results = [x for x in split_at_indices(paired, indices) if len(x) > 1]
     
        # formate la sortie en fonction du besoin  )
        values = [0] * len(data)
        for key, sequence in enumerate(results, start=1):
            for value in sequence:
                values[value[0]] = key
        return values

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Un truc du style :

    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
    datas = [
        [1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1],
        [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1],
        [1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1],
        [0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0],
        [0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0],
    ]
    ok = [
        [1, 1, 0, 2, 2, 0, 0, 0, 3, 3, 3],
        [0, 0, 1, 1, 0, 0, 0, 2, 2, 2, 2],
        [0, 0, 1, 1, 0, 0, 0, 2, 2, 0, 0],
        [0, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0],
        [0, 1, 1, 0, 0, 0, 0, 2, 2, 2, 0],
    ]
     
    for data_,ok_ in zip(datas,ok):
        out = [0]*len(data_)
        cmpt = 0
        flag = False
        b = data_[:]+[0]
     
        for i in range(len(out)):
            t = b[i] and (b[i-1] or b[i+1])
            cmpt += t and not flag
            flag = t
            out[i] = cmpt * t
     
        print(data_)
        print(ok_,out==ok_)
        print()

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Citation Envoyé par josmiley Voir le message
    Un truc du style
    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def horizontal(data: list) -> list:
        out = [0] * len(data)
        cmpt = 0
        flag = False
        b = [bool(x) for x in data] + [False]
     
        for i in range(len(out)):
            t = b[i] and (b[i - 1] or b[i + 1])
            cmpt += int(t) and not flag
            flag = t
            out[i] = cmpt * int(t)
        return out
    Très légèrement modifié (en tableau de booléens) car le calcul est sur le séparateur("0"). Fonctionne avec [5, "c", 0, 1, 1, 0, 1, 0, 1, 1, 1]

    Faire le calcul sur un tableau virtuel plus grand simplifie le code.

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 219
    Par défaut
    Hello,
    c'est amusant, j'ai posé le problème à léo l'I.A du navigateur Brave et en fait il m'a proposé le code de josmiley avec commentaires :
    Il semble que vous cherchiez à identifier des séquences de 1 (vrai) dans chaque liste de la première liste datas, de sorte que chaque séquence soit remplacée par un unique entier dans la liste ok. Cela peut être accompli en utilisant une approche itérative avec un compteur, comme démontré dans la solution proposée par josmiley.
    Voici une brève explication du code proposé par josmiley :

    Il initialise un compteur cmpt à zéro et une variable flag à False.
    Il itère sur chaque élément de la liste data_.
    Si l'élément actuel et l'un de ses voisins valent 1 (vrai) et que flag est False, il incrémente le compteur cmpt.
    Si l'élément actuel vaut 1 (vrai), il met à jour la variable flag en conséquence.
    Il met à jour l'élément out[i] avec le produit de cmpt et l'élément actuel.

    Ce code produit bien la sortie attendue dans ok. Si vous avez des questions sur ce code ou si vous avez besoin d'explications supplémentaires, n'hésitez pas à demander !
    Ami calmant, J.P

  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
    Hello,

    Possible solution avec de la refacto,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def horizontal(data: list) -> list:
        out = []
        counter = 0
        previous = 0
     
        for current, next_item in zip(data, data[1:] + [0]):
            # Condition pour savoir si l'élément fait partie d'un bloc connecté (adjacent à un autre élément non nul)
            is_in_block = current and (previous or next_item)
            # Incrémentation du compteur uniquement au début d'un nouveau bloc connecté
            counter += int(is_in_block and not previous)
            out.append(counter if is_in_block else 0)
            previous = current
     
        return out

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    J'aime pas le code de josmiley et bien qu'on ait demandé pas de if then else je préfère cette mouture:
    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
    datas = [
        [1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1],
        [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1],
        [1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1],
        [0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0],
        [0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0],
    ]
    ok = [
        [1, 1, 0, 2, 2, 0, 0, 0, 3, 3, 3],
        [0, 0, 1, 1, 0, 0, 0, 2, 2, 2, 2],
        [0, 0, 1, 1, 0, 0, 0, 2, 2, 0, 0],
        [0, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0],
        [0, 1, 1, 0, 0, 0, 0, 2, 2, 2, 0],
    ]
     
     
    for values, ok_ in zip(datas, ok):
        L = [0] * len(values)
        n = f = 0
        values = values[:] + [0]
        for i in range(len(values)-1):
            if values[i] and values[i+1]:
                if not f:
                    f = 1
                    n += 1
                L[i] = n 
            elif f:
                f = 0
                L[i] = n 
        print(*values, sep='')
        print(*L, '  **' if L != ok_ else '  ok', sep='')
        print()
    J'ai mis du temps pour comprendre pourquoi j'aimais pas ce code: il y a une ligne de trop!
    Ce qui suit me semble plus digeste:
    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
    for data_,ok_ in zip(datas,ok):
        out = [0]*len(data_)
        cmpt = 0
        flag = False
        b = data_[:]+[0]
     
        for i in range(len(out)):
            t = b[i] and (b[i-1] or b[i+1]) 
            #cmpt += t and not flag 
            #flag = t  
            cmpt += t and not b[i-1] 
            out[i] = cmpt * t 
        print(*data_, sep='')
        print(*ok_,' ', out==ok_, sep='')
        print()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Merci à vous tous

    Comme indiqué (ensuite), je n'ai pas forcément 1, seul le 0 compte,
    mais donner un exemple "[5, 9, 0, 4, 75, 0, 11, 0, 41, 74, 1457]" rendait le problème (peut-être) confus.
    pour info, en fait, je travaille sur une classe et non un nombre SequenceItem { _datas ... def is_valid(): if self._datas... return False } et donc, j'utilise que item.is_valid()On a plus une chose en début de function : du type : b = [int(x.is_valide()) for x in data_] + [0] (sinon résultat du test n'est pas bon pour fred() et wiz())

    Puisque je ne l'utilise qu'une fois, la performance ne compte pas trop mais pourquoi ne pas tester avec timeit ...

    pour être proche de la réalité, 64x donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    patrick    0.00024247599867521785
    fred       0.00015922300008242019
    wiz        0.0001064770003722515
    jos        0.00010738299897639081
    Comme je suis surpris que mon "split" soit le plus lent

    Avec x10 000, confirmation du code le plus rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    patrick    0.028267207999306265
    fred       0.018975095001223963
    wiz        0.012794260997907259
    jos        0.012900942001579097
    +1 wiztricks, code plus concis et je vais gagner une nano seconde sur josmiley.

    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
    #!/usr/bin/env python
    import functools
    import timeit
     
     
    datas = [
        [5, 9, 0, 1, 1, 0, 1, 0, 1, 1, 1],
        [1, 0, 8, 1, 0, 2, 0, 1, 1, 1, 1],
        [1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1],
        [0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0],
        [0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0],
    ]
    ok = [
        [1, 1, 0, 2, 2, 0, 0, 0, 3, 3, 3],
        [0, 0, 1, 1, 0, 0, 0, 2, 2, 2, 2],
        [0, 0, 1, 1, 0, 0, 0, 2, 2, 0, 0],
        [0, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0],
        [0, 1, 1, 0, 0, 0, 0, 2, 2, 2, 0],
    ]
     
     
    def split_at_indices(lst, indices):
        results = []
        prev_index = 0
        for index in indices:
            results.append(lst[prev_index:index])
            prev_index = index + 1
        results.append(lst[prev_index:])
        return results
     
     
    def pat(data: list) -> list:
        # sauve les index
        paired = list(zip(range(len(data)), data))
        indices = [x[0] for x in paired if x[1] == 0]
        # split et supprime les sequences trop courtes
        results = [x for x in split_at_indices(paired, indices) if len(x) > 1]
     
        # formate la sortie fonction du besoin
        values = [0] * len(data)
        for key, sequence in enumerate(results, start=1):
            for value in sequence:
                values[value[0]] = key
        return values
     
     
    def fred(data_: list) -> list:
        out = []
        counter = 0
        previous = 0
     
        for current, next_item in zip(data_, data_[1:] + [0]):
            # Condition pour savoir si l'élément fait partie d'un bloc connecté (adjacent à un autre élément non nul)
            is_in_block = current and (previous or next_item)
            # Incrémentation du compteur uniquement au début d'un nouveau bloc connecté
            counter += int(is_in_block and not previous)
            out.append(counter if is_in_block else 0)
            previous = current
     
        return out
     
     
    def jos(data_: list) -> list:
        out = [0] * len(data_)
        cmpt = 0
        flag = False
        # b = [1 if x else 0 for x in data_] + [0]
        b = data_[:] + [0]
     
        for i in range(len(out)):
            t = b[i] and (b[i - 1] or b[i + 1])
            cmpt += t and not flag
            flag = t
            out[i] = cmpt * t
        return out
     
     
    def wiz(data_: list) -> list:
        out = [0] * len(data_)
        cmpt = 0
        # b = [1 if x else 0 for x in data_] + [0]
        b = data_[:] + [0]
     
        for i in range(len(out)):
            t = b[i] and (b[i - 1] or b[i + 1])
            # cmpt += t and not flag
            # flag = t
            cmpt += t and not b[i - 1] and b[i]
            out[i] = cmpt * t
        return out
     
     
    if __name__ == "__main__":
        print()
        for name, func in {
            "patrick": pat,
            "fred": fred,
            "wiz": wiz,
            "jos": jos,
        }.items():
            print(name, "---" * 12)
            for y, line in enumerate(datas):
                results = func(line)
                print("> ", line)
                print("  ", results, ok[y] == results)
                if ok[y] != results:
                    print("# ", ok[y])
                print()
     
        print()
        for name, func in {
            "patrick": pat,
            "fred": fred,
            "wiz": wiz,
            "jos": jos,
        }.items():
            t = timeit.Timer(functools.partial(func, datas[3]))
            print(f"{name:10} {t.timeit(10_000)}")

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Effectivement , bien vu

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par papajoker Voir le message
    +1 wiztricks, code plus concis et je vais gagner une nano seconde sur josmiley.
    Chez moi la mouture en "if then else" (wiz2) est plus rapide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    patrick    0.020125699999999996
    fred       0.012538999999999995
    wiz        0.010836300000000007
    wiz2       0.006606699999999993
    jos        0.011135699999999998
    sinon pour les erreurs, remplacer t = b[i] and (b[i - 1] or b[i + 1]) par t = bool(b[i] and (b[i - 1] or b[i + 1])) suffit.

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

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

Discussions similaires

  1. [AC-2010] Pouvoir effectuer un test sur deux enregistrements qui se suivent ?
    Par Warwolf dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 30/10/2015, 09h37
  2. [Débutant] trouver le nombre d'éléments qui se suivent dans une matrice
    Par fondeur39 dans le forum MATLAB
    Réponses: 3
    Dernier message: 26/12/2011, 18h14
  3. Réponses: 11
    Dernier message: 04/10/2011, 12h53
  4. Réponses: 8
    Dernier message: 13/09/2011, 17h06
  5. Réponses: 5
    Dernier message: 09/08/2011, 11h36

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