Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exo Java du mois d'avril : La blague de l'année

Un exercice tout simple, avec correction au programme

    31 mars 2011 à 22:54:18

    Bonjour,

    ça fait exactement un an, jour pour jour qu'aucun exercice Java n'était plus apparus dans la liste dans le forum. Je relance donc les festivités avec un exercice que chacun (débutant comme pro) appréciera. Il est en rapport avec le thème du 01 avril, et ça vous servira peut être pour vos blagues.

    J'ai crée ce sujet pour discutter de vos remarques sur l'exercice, si vous n'avez pas compris quelque chose, ou si vous avez des problèmes pour avancer, je suis là pour vous tenir compagnie :)

    Allez voir l'exercice et revenez en discutter.
    • Partager sur Facebook
    • Partager sur Twitter
    J'ai tous les badges d'OpenClassrooms.
      2 avril 2011 à 10:31:04

      Comment trouvez vous la difficulté des questions ? est-ce que le sujet vous intéresse ?
      • Partager sur Facebook
      • Partager sur Twitter
      J'ai tous les badges d'OpenClassrooms.
      Anonyme
        2 avril 2011 à 11:03:56

        Arraylist<Arraylist<String>> store
        Arraylist getMotsCles
        ...

        il y a une raison de déclarer l'implémentation plutôt que l'interface?

        sinon c'est sympa comme sujet, ça permet de toucher un peu à des choses intéressantes.
        • Partager sur Facebook
        • Partager sur Twitter
          2 avril 2011 à 11:13:56

          Citation : shakhal


          il y a une raison de déclarer l'implémentation plutôt que l'interface?


          En effet on peut aussi passer par une interface, mais je préfère faire déjà au plus simple pour les débutants. Mais c'est clair qu'un seim-pro/pro doit pouvoir proposer une autre implémentation encore meilleur que celle de base. :)
          • Partager sur Facebook
          • Partager sur Twitter
          J'ai tous les badges d'OpenClassrooms.
          Anonyme
            2 avril 2011 à 20:10:12

            Je vais voir pour m'y mettre ! J'avais justement besoin d'un petit peu de pratique !

            En tout cas je trouve ça bien de reprendre les exercices Java. Très bonne initiative willard !
            • Partager sur Facebook
            • Partager sur Twitter
              6 avril 2011 à 22:51:22

              Ça y est! J'ai commencé! Ça me semble plutôt compliquer par-contre... J'en redonne des nouvelles!
              • Partager sur Facebook
              • Partager sur Twitter
                7 avril 2011 à 1:03:04

                La grande difficulté se trouve à la question 2, je peux comprendre que l'on s'y perd dans cette liste à deux dimensions. Mais une fois qu'on a compris comment ça marche les collections ça devient tout simple.

                Le but de l'exercice n'est pas de faire une gui, de toute façon le bot peut fonctionner en console tout seul (et je trouve qu'un bot en console c'est plus beau qu'une interface :) )
                • Partager sur Facebook
                • Partager sur Twitter
                J'ai tous les badges d'OpenClassrooms.
                  7 avril 2011 à 1:12:59

                  Perso, je prend pas la question 1 comme un réel défi... Ça ne m'a pas pris 2 minutes...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 avril 2011 à 1:26:09

                    En effet, la question 1 c'est de l’échauffement, mais tu dis ça parce que t'as déjà un certain niveau :)

                    Bon courage tout de même.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    J'ai tous les badges d'OpenClassrooms.
                      7 avril 2011 à 1:30:02

                      C'est vrai que je suis déjà à un certain niveau (en toute modestie... :D) mais il faut tout de même un assez bon niveau pour la question 2... C'est pas M. Mme tout le monde qui peut le faire.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 avril 2011 à 1:37:13

                        La question 2 est orientée algorithme, à la base dès qu'on a le bon algo il faut juste savoir comment le traduire ensuite.
                        Dailleurs je suis moi même en train de faire la correction :D un débutant peux y arriver .. biensur n'oublions pas que le forum est aussi là pour ça.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        J'ai tous les badges d'OpenClassrooms.
                          8 avril 2011 à 3:04:38

                          Est-ce que quelqu'un peut me donner un indice pour l'algorithme de comparaison des mots clés? Les mots clés d'un seul mot, ça va, mais pas ceux de 2 mots au plus...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 avril 2011 à 10:08:24

                            Un algo pour ça serait de parcourir l'ensemble des reponses de ton dictionnaire et de faire un matching entre chaque réponse (combinaison logique des chaines) et les mots clés. en résultat de ce matching tu devras en ressortir une valeur de classement (qui est en fait le taux de similarité entre la réponse et les mots clés).
                            Il ne te reste plus qu'a recuperer celui qui a le plus fort taux.

                            Après tu peux optimisé l'algo pour ne pas parcourir systématiquement tout le dictionnaire.

                            A toi de voir ... il y'a moulte façon de le faire
                            • Partager sur Facebook
                            • Partager sur Twitter
                            J'ai tous les badges d'OpenClassrooms.
                              13 avril 2011 à 23:20:18

                              Salut !
                              D'abord merci à Willard pour l'exo, j'ai essayé de faire une petite solution rien que pour aider à animer un peu le forum.

                              Mais avant de proposer ma solution, j'ai quelques remarques à faire à propos du l'énoncé :
                              • La première question est indépendante du reste de l'exercice. Tu aurais dû la remplacer par une question plus utile pour l'exercice (par exemple : la décomposition d'une phrase en mots, le test de l'égalité des éléments de deux collections ...)
                              • L'énoncé de la deuxième partie est flou, et la manière avec laquelle tu traite le problème (classe DicoReponse, méthode getReponse(ArrayList)) est bizarre (ça peut étre un effet secondaire du fait que le tout n'est pas très claire).
                              • Tu as donné (presque) toutes les classes/méthodes à implémenter. Du coup, on perd la phase la plus importante de la réalisation d'un programme Java, à savoir la conception.
                              • Pour la représentation des mot clés, un HashSet me parait plus convenable qu'un ArrayList (mais j'avoue qu'un ArrayList<HashSet> va surement effrayer les débutants).



                              Maintenant, voici mon essai.
                              Première question :
                              class Echo {
                              
                                  void start() {
                                      Scanner scan = new Scanner(System.in);
                                      String s = "";
                                      System.out.println("Bienvenue, veuillez saisir un texte");
                                      while (!(s = scan.nextLine()).equals("exit")) {
                                          System.out.println("Vous avez écrit: " + s);
                                      }
                                      scan.close();
                                  }
                              }
                              


                              2ème question :
                              Classe DicoResponse :
                              class DicoResponse {
                              
                                  String text;
                                  ArrayList<ArrayList<String>> store = new ArrayList<ArrayList<String>>();
                                  //J'ai utilisé une liste d'argument à taille variable dans le constructeur 
                                  //pour simplifier un peu l'instantiation de la classe.
                                  public DicoResponse(String answer, ArrayList<String> question, ArrayList<String>... questions) {
                                      text = answer;
                                      store.add(question);
                                      store.addAll(Arrays.asList(questions));
                                  }
                              
                                  public ArrayList<ArrayList<String>> getStore() {
                                      return store;
                                  }
                              
                                  public String getText() {
                                      return text;
                                  }
                              }
                              


                              J'ai représenté la "base de connaissances" du programme par un attribut statique de la classe Dico (liste de DicoResponse).

                              class Dico {
                              
                                  static ArrayList<DicoResponse> dictionnary = new ArrayList<DicoResponse>();
                              
                                  public static void add(DicoResponse d) {
                                      dictionnary.add(d);
                                  }
                              
                                  public static ArrayList<String> getKeyWords(String text) {
                                      // On utilise un ensemble pour éliminer les doublons
                                      Set<String> set = new HashSet(Arrays.asList(text.split(" ")));
                                      // puis retour à la liste (ce qui aurait pu être évité en utilisant un HashSet dès le début)
                                      ArrayList<String> al = new ArrayList<String>();
                                      for (String mot : set) {
                                          al.add(mot);
                                      }
                                      return al;
                                  }
                                  // La méthode parcourt les listes des mot clés des différentes réponses existantes dans le 
                                  // dictionnaire et retourne la première réponse valide (on peut aussi tester toutes les réponses
                                  // possibles puis choisir celle qui possède le plus grand nombre de mot clés)
                                  public static DicoResponse getResponse(String question) {
                                      ArrayList<String> keyWords = getKeyWords(question);
                                      for (DicoResponse dr : dictionnary) {
                                          for (ArrayList<String> words : dr.getStore()) {
                                              if (keyWords.containsAll(words)) {
                                                  return dr;
                                              }
                                          }
                                      }
                                      return null;
                                  }
                              
                                  public static void affiche(DicoResponse rep) {
                                      if (rep == null) {
                                          System.out.println("...");
                                      } else {
                                          System.out.println(rep.getText());
                                      }
                                  }
                              }
                              
                              public class Main {
                              
                                  public static void main(String[] args) {
                                      //Remplissage de la base de connaissances
                              
                                      ArrayList<String> a1 = new ArrayList<String>();
                                      a1.add("comment");
                                      a1.add("tu");
                                      a1.add("vas");
                              
                                      ArrayList<String> a2 = new ArrayList<String>();
                                      a2.add("la");
                                      a2.add("forme");
                                      a2.add("?");
                              
                                      Dico.add(new DicoResponse("Salut, tout va bien aujourd'hui", a1, a2));
                              
                                      //Exemple d'utilisation
                                      Dico.affiche(Dico.getResponse("yo willard, la forme ou pas la forme ?"));
                                      System.out.println(Dico.dictionnary);
                                  }
                              }
                              


                              C'est moche dans quelques endroit, mais ça c'est dû à java pas à moi :-° (par exemple la non variance des génériques m'a empêché de faire quelques simplifications).
                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 avril 2011 à 23:36:04

                                @Eisntein++ : c'est sympa de participer pour les exercices et merci pour tes remarques sur les questions. Comme tu l'as remarqué j'ai voulu épargner l'étape de conception à ceux qui devaient résoudre l'exo étant donné qu'il est orienté débutant. Mais la conception est compensée par l'algorithme a mettre en place dans la partie 2.

                                Je dois aussi l'avouer, elle n'est pas super claire cette deuxième partie :p . Je me suis dis que si un débutant arrive sur cet question et qu'il ne sais pas par ou commencer il risque d'aller dans tous les sens, j'ai voulu un peu cadrer le truc.

                                Ton code à l'air bien en forme , mais je regarderai le fond demain pour en faire quelques remarques, ça laisse le temps à certains zeros qui ont déjà commencé à travailler les questions de faire leur remarques sur le code d'Enstein++.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                J'ai tous les badges d'OpenClassrooms.
                                  1 mai 2011 à 18:22:59

                                  La correction de l’exercice est enfin disponible ici.

                                  @Einstein :
                                  Quelques remarques sur ton essai, mais rien de bien méchant :

                                  - Dans ta classe DicoResponse tu devrais mieux encapsuler tes variables, laisser en visibilité package n'est pas très propre.

                                  - Quand tu fais ton split lors de l'élimination des doublons tu n'enlève que le caractère espaces, pourtant il faudrait enlever aussi les virgules, apostrophes, etc. qui n'aident pas à la description de la question.

                                  - Quand tu finis d'éliminer les doublons, tu peut utiliser la méthode addAll pour rajouter tous les éléments de ton HashSet dans ta Liste, c'est plus simple à écrire que de faire une boucle for.

                                  - La méthode getReponse n'est pas encore optimale, en effet les mots clés d'une question ne peuvent pas toujours être toutes contenues dans le dictionnaire de la réponse adaptée. Il faut donc chercher la réponse qui se rapproche le plus. J'ai exposée d'ailleurs une méthode pour le faire dans la correction.

                                  Sinon, beau boulot tout de même , tu aurais pu aussi essayer la question 3, elle était aussi facile que la Question 1, avec le code de base que j'ai donné.

                                  Merci à ceux qui ont essayé.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  J'ai tous les badges d'OpenClassrooms.

                                  Exo Java du mois d'avril : La blague de l'année

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown