Advertisement
MonsterScripter

CodinGame_2023_08_31__20_09_22__unary.java

Aug 31st, 2023
875
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.62 KB | None | 0 0
  1. import java.util.Scanner;
  2.  
  3. /**
  4.  * Objectif Le binaire avec des 0 et des 1 c'est bien. Mais le binaire avec que des 0, ou presque, c'est encore mieux.
  5.  * Ecrivez un programme qui, à partir d'un message en entrée, affiche le message codé avec cette technique en sortie.
  6.  *
  7.  * Règles Voici le principe d'encodage :
  8.  *
  9.  * Le message en entrée est constitué de caractères ASCII (7 bits)
  10.  * Le message encodé en sortie est constitué de blocs de 0
  11.  * Un bloc est séparé d'un autre bloc par un espace
  12.  * Deux blocs consécutifs servent à produire une série de bits de même valeur (que des 1 ou que des 0) :
  13.  * - Premier bloc : il vaut toujours 0 ou 00. S'il vaut 0 la série contient des 1, sinon elle contient des 0
  14.  * - Deuxième bloc : le nombre de 0 dans ce bloc correspond au nombre de bits dans la série
  15.  *
  16.  * Exemple Prenons un exemple simple avec un message constitué d'un seul caractère : C majuscule. C en binaire vaut
  17.  * 1000011 ce qui donne avec cette technique :
  18.  *
  19.  * 0 0 (la première série composée d'un seul 1)
  20.  * 00 0000 (la deuxième série composée de quatre 0)
  21.  * 0 00 (la troisième série composée de deux 1)
  22.  * C vaut donc : 0 0 00 0000 0 00
  23.  *
  24.  * Deuxième exemple, nous voulons encoder le message CC (soit les 14 bits 10000111000011) :
  25.  *
  26.  * 0 0 (un seul 1)
  27.  * 00 0000 (quatre 0)
  28.  * 0 000 (trois 1)
  29.  * 00 0000 (quatre 0)
  30.  * 0 00 (deux 1)
  31.  * CC vaut donc : 0 0 00 0000 0 000 00 0000 0 00
  32.  *
  33.  * Entrées du jeu Entrée Ligne 1 : le message composé de N caractères ASCII (sans retour chariot) Sortie Le message encodé
  34.  * Contraintes 0 < N < 100
  35.  *
  36.  * Exemple Entrée C Sortie 0 0 00 0000 0 00
  37.  */
  38. class Solution {
  39.  
  40.     public static void main(String args[]) {
  41.         final Scanner in = new Scanner(System.in);
  42.         final String message = in.nextLine();
  43.         final int CHAR_BYTE = Character.SIZE / 2;
  44.         final StringBuilder sBin = new StringBuilder();
  45.         final StringBuilder result = new StringBuilder();
  46.         String prefixTmpBin;
  47.         String tmpBin;
  48.         for (int i = 0; i < message.length(); i++) {
  49.             tmpBin = Solution.toBinaryString(message.charAt(i));
  50.             // Zéro qui manque(nt) à l'avant si le nombre est < à 8bits
  51.             prefixTmpBin = "";
  52.             for (int j = tmpBin.length(); j < CHAR_BYTE - 1; j++) {
  53.                 prefixTmpBin += "0";
  54.             }
  55.             tmpBin = prefixTmpBin + tmpBin;
  56.             sBin.append(tmpBin);
  57.         }
  58.         int j = 0;
  59.         for (int i = 0; i < sBin.length(); i = j, j = i) {
  60.             while (j < sBin.length() && sBin.charAt(i) == sBin.charAt(j)) {
  61.                 j++;
  62.             }
  63.             if (sBin.charAt(i) == '1') {
  64.                 result.append("0 ");
  65.             } else if (sBin.charAt(i) == '0') {
  66.                 result.append("00 ");
  67.             }
  68.             for (int k = 0; k < j - i; k++) {
  69.                 result.append("0");
  70.             }
  71.             result.append(" ");
  72.         }
  73.         System.out.println(result.toString().trim());
  74.         in.close();
  75.         return EXIT_SUCCESS;
  76.     }
  77.  
  78.     /**
  79.      * Convertit un caractère en binaire
  80.      *
  81.      * @param c le caractère à convertir
  82.      * @return la représentation binaire du caractère
  83.      */
  84.     public static String toBinaryString(char c) {
  85.         int cValue = (int) c;
  86.         final StringBuilder sb = new StringBuilder();
  87.         while (cValue > 0) {
  88.             if (cValue % 2 == 0) {
  89.                 sb.append("0");
  90.             } else {
  91.                 sb.append("1");
  92.             }
  93.             cValue /= 2;
  94.         }
  95.         return sb.reverse().toString();
  96.     }
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement