Advertisement
MonsterScripter

CodinGame_2023_09_03__22_26_09__Retro_Typewriter_Art.java

Sep 3rd, 2023
1,144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.58 KB | None | 0 0
  1. import java.util.Scanner;
  2. import java.util.Map;
  3. import java.util.HashMap;
  4.  
  5. /**
  6.  * Objectif
  7.  * Autrefois, les gens s'amusaient à transformer des "recettes" en images surprises à l'aide de machines à écrire.
  8.  * Utilisez la recette fournie pour créer une image reconnaissable.
  9.  *
  10.  * Les morceaux de la recette sont séparés par un espace.
  11.  * Chaque morceau vous indiquera soit :
  12.  * - nl signifiant Nouvelle Ligne (retour chariot)
  13.  * - ~ou~
  14.  * - combien de fois répéter un caractère donné
  15.  *
  16.  * Par exemple :
  17.  * - 4z signifie zzzz
  18.  * - 1{ signifie {
  19.  * - 10= signifie ==========
  20.  * - 5bS signifie \\\\\ (voir la liste des abréviations ci-dessous)
  21.  * - 27 signifie 77
  22.  * - 123 signifie 333333333333 (si un morceau est composé uniquement de chiffres, le caractère est le dernier chiffre.)
  23.  *
  24.  * Donc, si une partie de la recette est
  25.  * 2* 15sp 1x 4sQ nl
  26.  * ... cela signifie d'afficher
  27.  * **               x''''
  28.  * puis passer à une nouvelle ligne.
  29.  *
  30.  * Abréviations utilisées :
  31.  * - sp = espace
  32.  * - bS = barre oblique inversée \
  33.  * - sQ = apostrophe simple '
  34.  * et
  35.  * - nl = Nouvelle Ligne
  36.  *
  37.  * Sources/références :
  38.  * https://asciiart.cc
  39.  * https://loriemerson.net/2013/01/18/d-i-y-typewriter-art/
  40.  * https://www.youtube.com/watch?v=kyK5WvpFxqo
  41.  *
  42.  * Entrée
  43.  * Une chaîne de caractères représentant la recette
  44.  *
  45.  * Sortie
  46.  * Une chaîne de caractères (sur plusieurs lignes) représentant l'image créée par la recette
  47.  *
  48.  * Contraintes
  49.  * 5 ≤ Longueur de la recette ≤ 1000
  50.  * Il n'y aura pas de guillemets doubles (") dans la recette
  51.  * La recette contiendra au moins 1 nl (Nouvelle Ligne)
  52.  *
  53.  * Exemple
  54.  * Entrée
  55.  * 1sp 1/ 1bS 1_ 1/ 1bS nl 1( 1sp 1o 1. 1o 1sp 1) nl 1sp 1> 1sp 1^ 1sp 1< nl 2sp 3|
  56.  * Sortie
  57.  *  /\_/\
  58.  * ( o.o )
  59.  *  > ^ <
  60.  *   |||
  61.  **/
  62. class Solution {
  63.  
  64.     public static void main(String args[]) {
  65.         final Scanner in = new Scanner(System.in);
  66.         final String T = in.nextLine();
  67.  
  68.         // Définition des abréviations utilisées
  69.         Map<String, String> abbr = new HashMap<String, String>(); {
  70.             abbr.put("sp", " ");
  71.             abbr.put("bS", "\\\\");
  72.             abbr.put("sQ", "\'");
  73.             abbr.put("nl", "\n");
  74.         }
  75.        
  76.         final StringBuilder sb = new StringBuilder();
  77.  
  78.         // Délimiteur utilisé pour séparer les morceaux de la recette
  79.         final String delimiter = " ";
  80.         final String[] symbols = T.split(delimiter);
  81.        
  82.         for (String s : symbols) {
  83.             // Remplacement des abréviations par leur valeur correspondante
  84.             for (Map.Entry<String, String> entry : abbr.entrySet()) {
  85.                 s = s.replaceAll(entry.getKey(), entry.getValue());
  86.             }
  87.            
  88.             int firstCharIndex = 0;
  89.             for (Character c : s.toCharArray()) {
  90.                 if (Character.isDigit(c)) firstCharIndex++;
  91.                 else break;
  92.             }
  93.             Integer r;
  94.             String content;
  95.             if (firstCharIndex > 0) {
  96.                 // Si le morceau commence par des chiffres, récupérer le nombre
  97.                 r = Integer.parseInt(s.substring(0, firstCharIndex));
  98.                 content = s.substring(firstCharIndex, s.length());
  99.             } else {
  100.                 r = 1;
  101.                 content = s;
  102.             }
  103.            
  104.             // Répéter le contenu du morceau la bonne quantité de fois
  105.             for (int i = 0; i < r; i++) {
  106.                 sb.append(content);
  107.             }
  108.         }
  109.         System.out.println(sb.toString());
  110.     }
  111. }
  112.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement