Advertisement
Tecnelm

Untitled

Nov 16th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.87 KB | None | 0 0
  1. import java.text.Normalizer;
  2. import java.util.*;
  3.  
  4. public class Code_analyse_frequence {
  5.  
  6.     static ArrayList < Character > text_lettre = new ArrayList < Character > ();
  7.  
  8.     public static Scanner read = new Scanner(System.in);
  9.  
  10.     // cette fonction va éliminer les doublons d'une arraylist
  11.     public static ArrayList < Character > antidoublon(ArrayList < Character > newlist) {
  12.         ArrayList < Character > List = new ArrayList < Character > ();
  13.         for (int i = 0; i < newlist.size(); i++) {
  14.             Object o = newlist.get(i); // type objet qui sera l'index i de liste pricipale ( texte decomposer en char)
  15.             if (!List.contains(o)) // regarde si la lettre de la liste rentré est deja dans la nouvelle list et l'ajoute si elle n'y est pas
  16.                 List.add(newlist.get(i)); // ceci va donc enlever les doublon
  17.         }
  18.         return List;
  19.     }
  20.     // cette fonction va transformer les majuscule en minuscule et enlever les accent ou autre charactère "speciaux"
  21.     public static String FormatTexte(String texte) {
  22.         return Normalizer.normalize(texte, Normalizer.Form.NFD).replaceAll("[\u0300-\u036F]", "");
  23.         /* Sépare les caractere a accent en unicode ex â -> 'a'+'^' en unicode puis ilimine les caracter qui ne sont pas des lettre*/
  24.     }
  25.     // cette fonction va regarder si un string est constituer uniquement de nombre
  26.     public static boolean IsNumeric(String decodeOrder) {
  27.         boolean test = true;
  28.         if (decodeOrder.length() == 0) // regarde si la liste et vide et retourne false si oui
  29.             return false;
  30.         for (int i = 0; i < decodeOrder.length(); i++) {
  31.             if (!(Character.isDigit(decodeOrder.charAt(i)))) // regarde si la liste ne contient que des nombres
  32.             {
  33.                 test = false;
  34.                 return test;
  35.             } else
  36.                 test = true;
  37.  
  38.         }
  39.         return test;
  40.     }
  41.     // cette fonction va décoder le text chiffré en lui donnant le décalage
  42.     public static void decode(ArrayList < Character > newlist, String decodeOrder) {
  43.         int decalage = 0; // decalage de decode
  44.         boolean run = false; // dire si il faut lancer le decodage ou non
  45.         char lettreE; // cette lettre servira au decode par la frequence ce serais la lettre la plus frequente
  46.         if (IsNumeric(decodeOrder)) // regarde si decode ordeur est deja le decalage
  47.         {
  48.             decalage = Integer.parseInt(decodeOrder);
  49.             if (decalage < 26 && decalage > -26) // verifie que le decalage est bien compris entre 25 et -25
  50.                 run = true;
  51.             else
  52.                 run = false;
  53.         } else {
  54.             lettreE = decodeOrder.charAt(0); // recupere le premier character rentré pour analyser la frequence
  55.             if (Character.isLetter(lettreE)) {
  56.                 decalage = AnalyseFreq(newlist, lettreE); // va realiser l'analyse de frequence de la lettre pour trouver le décalage
  57.                 run = true;
  58.             } else
  59.                 run = false;
  60.         }
  61.         if (run) {
  62.             String text = ""; // ceci est le texte decodé  via le decalage
  63.             char lettre = '\0'; // ceci est la variable  qui va recuperer la la lettre dans la liste
  64.             int nb_charact = newlist.size();
  65.  
  66.             for (int i = 0; i < nb_charact; i++) {
  67.                 lettre = newlist.get(i);
  68.                 if (lettre < 97 || lettre > 122) { // si autre chose qu'une lettre
  69.                     text += (char) lettre;
  70.                     continue;
  71.                 }
  72.                 if (decalage > 0) // decalage plus grand que 0 alors tu soustrait 1
  73.                 {
  74.                     for (int nb = 0; nb < decalage; nb++) {
  75.                         lettre -= 1;
  76.                         if (lettre < 97) // quand arrive a 'a' retourne a 'z'
  77.                             lettre = 122;
  78.                     }
  79.                     text += (char) lettre;
  80.                 } else // ajoute 1 si le decalage est plus petit que 1
  81.                 {
  82.                     for (int nb = 0; nb < -decalage; nb++) {
  83.                         lettre += 1;
  84.                         if (lettre > 122) // quand arrive a 'z' retourne a 'a'
  85.                             lettre = 97;
  86.                     }
  87.                     text += (char) lettre; // ajoute la lettre au texte
  88.                 }
  89.             }
  90.             System.out.println(text); //affiche le texte decodé
  91.         } else if (decodeOrder.length() == 0) // si les info plus haut ne sont pas lancer et que la chaine de character est vide alors
  92.             afficherTous(newlist, decodeOrder); //lancer afficherTous va stocker tous les possibilités
  93.  
  94.     }
  95.     // cette fonction va codé un text decomposé en character dans une arraylist
  96.     // cette fonction va coder le text chiffré en lui donnant le décalage
  97.     public static void code(ArrayList < Character > newlist, String codeOrder) {
  98.         boolean run = false; // ce boolean servira a lancer le code si tous est corect
  99.         int decalage = 0;
  100.         //cette partie va verifier  si la chaine de character donné est constituer uniquement de chiffre  si c est le cas elle le transforme en
  101.         // int puis se int servira de decalage
  102.         if (IsNumeric(codeOrder)) {
  103.             decalage = Integer.parseInt(codeOrder);
  104.             if (decalage < 26 && decalage > -26) // verifie que le decalage est bien compris entre 25 et -25
  105.                 run = true;
  106.             else
  107.                 run = false;
  108.         } else
  109.             run = false;
  110.         if (run) {
  111.             String text = ""; // il s'agit du texte traduit (codé)
  112.             char lettre = '\0'; // il s'agit de la lettre qui seras isolé a chaque pour etre codé
  113.             int nb_charact = newlist.size(); // taille du tableau
  114.  
  115.             for (int i = 0; i < nb_charact; i++) {
  116.                 lettre = newlist.get(i);
  117.                 if (lettre < 97 || lettre > 122); // si le charactere n est pas une lettre
  118.                 else {
  119.                     if (decalage > 0) // si le decalage est plus grand que 0 alors ajoute 1 au int du char
  120.                     {
  121.                         for (int nb = 0; nb < decalage; nb++) {
  122.                             lettre++;
  123.                             if (lettre > 122)
  124.                                 lettre = 97;
  125.                         }
  126.                         text += (char) lettre;
  127.                     } else // l'inverse  plus  petit que 0 alors enleve 1
  128.                     {
  129.                         for (int nb = 0; nb < -decalage; nb++) {
  130.                             lettre -= 1;
  131.                             if (lettre < 97)
  132.                                 lettre = 122;
  133.                         }
  134.                     }
  135.                 }
  136.                 text += (char) lettre; // cocacene la lettre a une chaine de chractère (qui seras le texte)
  137.             }
  138.             System.out.println(text); // affiche le texte
  139.         }
  140.     }
  141.     // cette fonction va stocker dans une ArrayList toute les possibilité de décodage
  142.     // cette fonction va décoder toutes les possibilité de chiffrage
  143.     public static ArrayList < String > afficherTous(ArrayList < Character > newlist, String codeOrder) {
  144.  
  145.         ArrayList < String > texteTraduit = new ArrayList < String > ();
  146.         String text = ""; // texte codé pour la possibilité X
  147.         char lettre = '\0'; // lettre recupérer dans la liste
  148.         int nb_charact = newlist.size();
  149.         for (int ii = 0; ii <= 25; ii++) // va coder toute les possibiliter de texte puis les stocker
  150.         {
  151.             for (int i = 0; i < nb_charact; i++) {
  152.                 lettre = newlist.get(i);
  153.                 if (lettre < 97 || lettre > 122);
  154.                 else {
  155.                     for (int nb = 0; nb <= ii; nb++) // soustrait 1 pour decodeer le texte va realiser toute les possibiliter
  156.                     {
  157.                         lettre--;
  158.                         if (lettre > 122)
  159.                             lettre = 97;
  160.                     }
  161.                 }
  162.                 text += (char) lettre; // crée le text en mettant  les lettre les une a la suite des autre
  163.             }
  164.             texteTraduit.add(text); // stocke le text dans une liste
  165.             text = "";
  166.         }
  167.         return texteTraduit;
  168.  
  169.     }
  170.  
  171.     /*public static ArrayList<Character>textList(String texte)
  172.     {
  173.         ArrayList<Character> text_lettre = new ArrayList<Character>();
  174.         int nb_charact = texte.length();
  175.          
  176.          for(int i = 0 ; i<nb_charact ; i++)
  177.              text_lettre.add(i,texte.charAt(i));
  178.          antilettreMaj(text_lettre);
  179.          return text_lettre;
  180.     }*/
  181.  
  182.  
  183.  
  184.     // cette fonction va analyser la frequence d'une lettre (peu ensuite return le decalage trouvé a modifier
  185.     // mettre int et rapporter le decalage
  186.  
  187.     public static int AnalyseFreq(ArrayList < Character > newlist, char LettreE) {
  188.         int posnbmax = 0, nbmax = 0, nblettre = 0, difference = 0; // mot ayant le meme nombre de lettre ;
  189.         char lettrefreq;
  190.         boolean test = false;
  191.  
  192.  
  193.         ArrayList < Character > lettre = new ArrayList < Character > ();
  194.  
  195.         lettre.addAll(antidoublon(newlist));
  196.  
  197.         //////////////////////////////////////////////
  198.         //cette partie du code va analiser la frequence des lettre codé
  199.         //////////////////////////////////////////////
  200.         for (int i = 0; i < lettre.size(); i++) {
  201.  
  202.             for (int ii = 0; ii < newlist.size(); ii++) {
  203.                 test = lettre.get(i) == newlist.get(ii);
  204.  
  205.                 if (test)
  206.                     nblettre++;
  207.             }
  208.             if (nblettre > nbmax) {
  209.                 posnbmax = i;
  210.                 nbmax = nblettre;
  211.             }
  212.  
  213.             // nb_lettre.add(i,nblettre);
  214.             nblettre = 0;
  215.         }
  216.         //////////////////////////////////////////////
  217.         //cette partie du code va s'occuper de donner la difference avec la lettre la plus commune, et redemander de tenter a chaque fois ou donner l'ordre de tous afficher
  218.         //////////////////////////////////////////////
  219.  
  220.         System.out.println("rentrez la lettre la plus utilisé " + posnbmax);
  221.         lettrefreq = read.nextLine().charAt(0);
  222.         LettreE = lettre.get(posnbmax);
  223.         difference = (int) LettreE - (int) lettrefreq;
  224.  
  225.         return difference;
  226.  
  227.     }
  228.  
  229.     // cette partie est la sequence d'initialisation demandant le text et le decomposant en character dans une
  230.     // Array list base pour les autre fonction
  231.     static void init() {
  232.  
  233.         System.out.println("rentrez votre texte a traduire");
  234.         String texte = read.nextLine();
  235.         texte = FormatTexte(texte);
  236.         int nb_charact = texte.length();
  237.  
  238.  
  239.         for (int i = 0; i < nb_charact; i++)
  240.             text_lettre.add(i, texte.charAt(i));
  241.  
  242.     }
  243.  
  244.     public static void main(String[] args) {
  245.         init();
  246.         read.close();
  247.     }
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement