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

JavaScript Discussion :

[Ludique] Mini-jeu : épisode 3 (déchiffrage de code, niveau : facile)


Sujet :

JavaScript

  1. #1
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut [Ludique] Mini-jeu : épisode 3 (déchiffrage de code, niveau : facile)
    Bon allez zou, on en ressert une louche à ceux qui avaient aimé

    (pour jeter un oeil aux deux précédents épisodes de cette époustouflante saga () c'est par ici et par là)

    Quoi ? Comment ? Qui a dit "Le nommage des variables et des fonctions, c'est pas important pour la compréhension du code" ?

    Objectif : modifier une ligne (voir commentaire) dans la fonction correction pour qu'elle corrige efficacement, c'est-à-dire que les mots contenus dans le tableau mots soient bien affichés comme attendu (voir plus bas).
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function correction() {
       var mots = ["mageur", "traget", "magestueux"];
       var resultat = mots;// <<< ici
       alert("Avant correction : \n" + mots.join("\n") + "\n\nAprès correction : \n" + resultat.join("\n"));
    }
    Résultat attendu dans l'alerte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Avant correction : 
    mageur
    traget
    magestueux
     
    Après correction : 
    majeur
    trajet
    majestueux
    En revanche, vous ne pouvez modifier que la ligne où figure le commentaire, et les seules fonctions que vous pouvez utiliser sont ces deux fonctions, retourner et multi :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Array.prototype.retourner = function(args, fonction) {
       fonction = fonction || [];
       var i;
       for (var retour = 0, i = [] || fonction; retour < this.length; ++retour)
          i.push(args.apply(this[retour], fonction));
       return i;
    }
     
    function multi(fa1se) { return this.replace(/g/g, fa1se); }
    Et enfin, mauvaise nouvelle : le malfaiteur ayant commis ces lignes est parait-il toujours en liberté. Où va le monde, je vous le demande.

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    euh puis-je te demander ce que signifie ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fonction = fonction || [];
    tu fais un ou entre une fonction et un tableau c'est ça ?

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function correction() {
       var mots = ["mageur", "traget", "magestueux"];
       var resultat = mots.retourner(multi, ["j", "j", "j"]); // <<< ici
       alert("Avant correction : \n" + mots.join("\n") + "\n\nAprès correction : \n" + resultat.join("\n"));
    }
    Heureusement qu'il y a Firebug !

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  4. #4
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par danielhagnoul Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function correction() {
       var mots = ["mageur", "traget", "magestueux"];
       var resultat = mots.retourner(multi, ["j", "j", "j"]); // <<< ici
       alert("Avant correction : \n" + mots.join("\n") + "\n\nAprès correction : \n" + resultat.join("\n"));
    }
    Bravo Daniel tu as été le plus rapide à trouver une solution qui fonctionne

    Mais il reste une solution plus courte que celle-ci... (je la donnerai demain soir si personne n'a trouvé entre temps ^^)
    Citation Envoyé par Auteur Voir le message
    euh puis-je te demander ce que signifie ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fonction = fonction || [];
    tu fais un ou entre une fonction et un tableau c'est ça ?
    Non, c'est une syntaxe que j'ai fini par apprécier pour initialiser un paramètre facultatif avec une valeur par défaut. Ici, les variables sont affreusement mal nommées donc on s'y perd ^^
    Techniquement, l'expression renvoie la première valeur si celle-ci est évaluée "true", sinon la seconde. Dans le cas d'un paramètre passé à la fonction, sur lequel vont être appliquées des méthodes spécifiques à un type d'objet, ce genre de précaution évite de lever une erreur quand le paramètre est undefined et qu'on essaie de lui faire un indexOf, un push, ou autre ^^

  5. #5
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    Permettez-moi de présenter cette version un peu torturée mais qui ne passe que par "multi", sauf qu'elle utilise d'autres sparadras...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var resultat = multi.apply(mots.join(" "),["j"]).split(" ");// <<< ici
    Merci pour cette troisième édition en tout cas. Ca me fait plaisir que tu continues.

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function correction() {
       var mots = ["mageur", "traget", "magestueux"];
       //var resultat = mots.retourner(multi, ["j", "j", "j"]); // <<< ici
       var resultat = mots.retourner(multi, ["j"]); // <<< ici
       alert("Avant correction : \n" + mots.join("\n") + "\n\nAprès correction : \n" + resultat.join("\n"));
    }
    C'est ainsi que l'on se rend compte que l'on tombe dans tous les pièges !

    @auteur : il a écrit fonction pas function

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  7. #7
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Par défaut
    Ben, oui, pourquoi mettre... ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mots.retourner(multi, ["j", "j", "j"]);
    ... alors que...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mots.retourner(multi, ["j"]);
    ... suffit amplement? ^^



    Edit: Merttt... grilled... xD

  8. #8
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par vermine Voir le message
    Merci pour cette troisième édition en tout cas. Ca me fait plaisir que tu continues.
    Merci vermine (mais.. mais... split ? apply ? non-respect des consignes ? c'est très mal )
    Citation Envoyé par danielhagnoul Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       var resultat = mots.retourner(multi, ["j"]); // <<< ici


    Citation Envoyé par Wapper Voir le message
    Edit: Merttt... grilled... xD
    Pas de beaucoup en tout cas ^^ félicitations à tous !

    Ce soir >>> solution et détails pour les curieux

  9. #9
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    tu pourrais en faire un prototype équivalent de array_map
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  10. #10
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Citation Envoyé par danielhagnoul Voir le message
    @auteur : il a écrit fonction pas function
    oui j'ai bien vu
    Mais j'avais à l'esprit que le second paramètre transmis à retourner() soit une fonction ou un tableau (comme quoi si une variable porte un nom mal fichu, cela peut induire en erreur )

    Citation Envoyé par RomainVALERI
    Non, c'est une syntaxe que j'ai fini par apprécier pour initialiser un paramètre facultatif avec une valeur par défaut. Ici, les variables sont affreusement mal nommées donc on s'y perd ^^
    Techniquement, l'expression renvoie la première valeur si celle-ci est évaluée "true", sinon la seconde. Dans le cas d'un paramètre passé à la fonction, sur lequel vont être appliquées des méthodes spécifiques à un type d'objet, ce genre de précaution évite de lever une erreur quand le paramètre est undefined et qu'on essaie de lui faire un indexOf, un push, ou autre ^^
    il y a trop longtemps que je n'ai pas fait de javascript

  11. #11
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut décryptage et détails de la solution
    Bon, la solution a donc déjà été donnée (bravo encore à Daniel et Wapper*)
    Mais pour rappel la voilà :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function correction() {
       var mots = ["mageur", "traget", "magestueux"];
       var resultat = mots.retourner(multi, ["j"]);
       alert("Avant correction : \n" + mots.join("\n") + "\n\nAprès correction : \n" + resultat.join("\n"));
    }
    Pour y voir un peu plus clair, commençons par redonner des noms honnêtes aux variables :
    Code javascript : 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
    function correction() {
       var mots = ["mageur", "traget", "magestueux"];
       var resultat = mots.appliquerATous(transformerTousLesG, ["j"]);
       alert("Tableau : \n" + tab.join("\n") + "\n\nTableau après iterations : \n" + resultat.join("\n"));
    }
     
    // UTILITE : applique la fonction passée en premier param sur chacun des éléments du tableau courant
    // PARAM #1 : "fonction" (function) : le traitement à appliquer sur chacune des valeurs du tableau
    // PARAM #2 : "_arguments" (tableau) : arguments à passer à la fonction à chaque occurrence
    // RETOUR : tableau des valeurs renvoyées par les exécutions successives de la fonction sur les éléments du tableau
    Array.prototype.appliquerATous = function(fonction, _arguments) {
       _arguments = _arguments || [];
       var retour = [];
       for (var i = 0; i < this.length; ++i)// pour chaque élément du tableau courant
          retour.push(fonction.apply(this[i], _arguments));// on applique la fonction donnée en paramètre
       // et on stocke le retour de son exécution dans le tableau qui sera renvoyé par la fonction appliquerATous
       return retour;
    }
     
    // simple fonction arbitraire modifiant une chaine passée en paramètre
    function transformerTousLesG(chaine) {
       return this.replace(/g/g, chaine);
    }
    La comparaison avec l'énoncé fait apparaître assez rapidement le procédé sordide mis à l'oeuvre lors de l'obfuscation de l'extrait : l'inversion du nom des variables (comme fonction et args par exemple), un infâme "fa1se" qui n'a trompé personne, et ne serait-ce que le nom stupide des fonctions... il n'en faut pas plus pour rendre obscur un bout de code limpide

    Remarque : certains d'entre vous l'auront probablement remarqué, la fonction nommée ici (un peu excessivement verbeux et francisé mais c'était pour l'exemple) appliquerATous() correspond à peu près (je n'ai plus leur code en tête mais grosso modo) à la fonction each qui existe dans certaines librairies comme Prototype et jQuery entre autres... ^^

    Merci à tous les participants et à la prochaine fois !


    * au passage, cette remarque : eh ben ça va la Belgique en force ! sur ce thread très particulièrement, mais même de manière générale, j'ai remarqué que les belges sont très présents sur les forums web et souvent de très bon niveau.... chapeau les mecs ! Vous commencez tous à l'école primaire ou quoi ?

  12. #12
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Par défaut
    Peut-être as-tu simplement oublié ce que tu as indiqué dans l'intitulé... "facile"

  13. #13
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Ce n'était pas difficile, mais tout était mis en oeuvre pour égarer le raisonnement.

    Il fallait surtout se rappeler la syntaxe de "apply" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unObjet.methode.apply(autreObjet, [arg1, arg2, arg3, etc]);
    Voici une énigme claire, sans aucune astuce pour égarer le raisonnement, destinée au professeur Valeri. Mais s'il ne trouve pas dans l'heure la compétition est ouverte à tous.

    Trouvez la valeur de p1 et de p2, qui donne la réponse "true" avec Firefox et "false" avec Chrome et IE !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function X(p1, p2){
    	return (p1 === p2.content);
    }
     
    alert(X(p1,p2));
    J'ai testé avec Firefox 3.6.10, Chrome 7 et IE 8.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  14. #14
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Par défaut
    Trop facile...

    window,window

    C'était bien dans l'heure, hein? ^^

  15. #15
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par Wapper Voir le message
    Trop facile...

    window,window

    C'était bien dans l'heure, hein? ^^

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  16. #16
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par danielhagnoul Voir le message
    Voici une énigme claire, sans aucune astuce pour égarer le raisonnement, destinée au professeur Valeri. Mais s'il ne trouve pas dans l'heure la compétition est ouverte à tous.

    Trouvez la valeur de p1 et de p2, qui donne la réponse "true" avec Firefox et "false" avec Chrome et IE !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function X(p1, p2){
    	return (p1 === p2.content);
    }
     
    alert(X(p1,p2));
    J'ai testé avec Firefox 3.6.10, Chrome 7 et IE 8.
    Alors bon ben j'ai une solution mais je suis presque sûr que tu attendais quelque chose de plus élégant... j'ai cherché... mais en vain ^^ (enfin j'ai quand même une solution qui marche en tout cas )
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X(((document.all) ? "ie": ""), document.createElement("META"))
    // renvoie true dans FF et false dans IE ^^


    edit : ah tiens je ne connaissais pas la propriété content de window ^^ encore moins les différences de son implémentation dans IE/FF ^^ je n'aurais pas trouvé je crois... j'ai cherché dans de mauvaises directions

  17. #17
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Par défaut
    Moi, c'est la première idée qui m'est venue...

    ... peut-être de par les recherches pour mes dernières optimisations de scripts...

  18. #18
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X(((document.all) ? "ie": ""), document.createElement("META"))
    Bravo pour l'effort Professeur Valeri !

    L'attribut content d'une balise meta, je pensais que la plupart des participants se focaliseraient sur elle, mais Wapper est trop fort !

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

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

Discussions similaires

  1. [Ludique] Mini-jeu niveau très dur
    Par gwyohm dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 25/01/2011, 08h42
  2. [Ludique] Mini-jeu - niveau 2 : déchiffrage de code (niveau modéré)
    Par RomainVALERI dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 28/07/2010, 23h15
  3. [Ludique] Mini-jeu : déchiffrage de code (niveau facile)
    Par RomainVALERI dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/07/2010, 18h24
  4. [Source] jeu de baston jouable et code source (C++)
    Par shaman321 dans le forum Contribuez
    Réponses: 3
    Dernier message: 16/01/2007, 20h02
  5. mini jeu en construction (débutant)
    Par samy100 dans le forum C
    Réponses: 45
    Dernier message: 23/04/2006, 23h36

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