Partage
  • Partager sur Facebook
  • Partager sur Twitter

CodinGame - Puzzle ASCII Art

    12 août 2021 à 11:18:09

    Bonjour à tous,

    Je suis en train de travailler sur le puzzle "ASCII Art" de CodinGame.

    ---------------------------------------------------------------------------------------------------------------------

    Voici les consignes :

    La mission : écrire un programme capable d'afficher une ligne de texte en ASCII art dans un style qui est fourni en entrée. Toutes les lettres font la même largeur et la même hauteur.

    Les entrées : 

    Ligne 1 : la largeur L d'une lettre en ASCII art

    Ligne 2 : la hauteur H d'une lettre en ASCII art

    Ligne 3 : la ligne de texte T, composée de N caractères ASCII

    Lignes suivantes : la chaine de caractères ABCDEFGHIJKLMNOPQRSTUVWXYZ? en ASCII art

    En sortie:

    On doit convertir le texte T en ASCII art. Les caractères de [a-z] doivent être affiché en ASCII art par leur équivalent en majuscule. Les caractères qui ne sont pas dans les intervalles [a-z] ou [A-Z], seront affichés par le point d'interrogation en ASCII art.

    ---------------------------------------------------------------------------------------------------------------------

    Voilà le raisonnement que j'ai choisi d'utiliser :

    1. Mettre T au bon format (majuscule et ?)

    2. Transformer T (chaine de caractère) en TPosAlphabet (tableau de int). Chaque TPosAlphabet[i] donne la position de la lettre T[i] dans l'alphabet. Par exemple : A = 0, B = 1, C = 2, ... et si T[i] n'est pas dans [A-Z] alors j'attribue la valeur 26.

    3. Utiliser TPosAlphabet pour afficher T en ASCII Art 

    J'ai suivi les conseils que l'on m'a donné sur ce forum lorsque j'ai posé une question sur le puzzle précédent: j'ai lu un cours d'algorithmique / pseudo-code. J'ai réussi sans problème à faire les deux premières étapes. Malheureusement, j'ai beaucoup plus de mal avec la partie 3. J'ai une erreur de segmentation à la ligne indiquée dans mon code. Je vous mets le pseudo code et le code que j'ai écris ci-dessous :

    En pseudo-code :

    VARIABLE h : NUMERIC //indice de ligne de l'alphabet en ASCII art
    VARIABLE l : NUMERIC // indice de colonne de l'alphabet en ASCII art
    ARRAY answer : STRING
    
    FOR h = 0 FROM h TO H, STEP 1 // je parcours les lignes de l'alphabet ASCII art, ligne par ligne
    	
    	ARRAY ROW[1025] : STRING // ROW : alphabet en ASCII art
    	LIRE ROW
    	
    	FOR i = 0 FROM i TO sizeT, STEP 1 // je parcours TPosAlphabet
    		
    		FOR l = 0 FROM l TO L*26, STEP 1 // je parcours chaque caractère d'une ligne de l'alphabet en ASCII art, de caractère en caractère
    
    			WHILE (TPosAlphabet[i]*L) - 3 < l < TPosAlphabet[i]*L 
    			DO concaténer les caractères de ROW dans answer
    
    		l NEXT // caractère suivant
    
    	i NEXT // TPosAlphabet suivant
        WRITE answer
    h NEXT // ligne de l'alphabet ASCII art suivante 
    

    En C : 

    int h = 0;
    int l = 0;
    char answer[5000];
    for (h = 0; h < H; h++){
       char ROW[1025];
       scanf("%[^\n]", ROW); 
       fgetc(stdin);
       for (i = 0 ; i < N ; i++){
          for (l = 0; l < L*26; l++){
             while((TPosAlphabet[i]*L)-3 < l && l < TPosAlphabet[i] * L){
                strcat(answer, ROW);
             }
          }
       }
       printf("%s", answer); 
    }  


    Idéalement, si quelqu'un pouvais me dire ce qui cloche dans mon algo sans forcément le traduire en C, ca serait déjà super ! J'aimerais essayer de faire la traduction seul. Je rappel que suis débutant et que je relis le cours d'OpenClassroom en parallèle, je sais que je n'ai pas encore acquis les bases. Mais il parait que c'est en forgeant qu'on devient forgeron !


    Merci d'avance pour votre aide !

    Lucas



    -
    Edité par LucasLethuillier 12 août 2021 à 14:47:29

    • Partager sur Facebook
    • Partager sur Twitter
      12 août 2021 à 15:30:27

      Hello,

      Juste en lisant le code: il est probable que l'erreur vienne de la ligne 11: answer n'a pas été initialisé. On ne peut donc pas préjuger de la présence d'un \0.

      Autre chose: que vautTPosAlphabet[i] ?

      Et, en ascii, il y a un rapport direct entre une lettre et sa valeur numérique: 'A'=64, 'B'=65, etc. Et 'C'-'A'='c'-'a'=2. Tu n'as donc sans doute pas besoin de TPosAlphabet.

      -
      Edité par edgarjacobs 12 août 2021 à 15:32:11

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        12 août 2021 à 16:20:47

        edgarjacobs a écrit:

        Autre chose: que vaut TPosAlphabet[i] ?

        Et, en ascii, il y a un rapport direct entre une lettre et sa valeur numérique: 'A'=64, 'B'=65, etc. Et 'C'-'A'='c'-'a'=2. Tu n'as donc sans doute pas besoin de TPosAlphabet.

        -
        Edité par edgarjacobs il y a 33 minutes


        Hello, merci pour ta réponse 

        Pour la conversion T[i] vers TPosAlphabet[i],  j'ai utilisé le code suivant :

        for (i = 0 ; i < N ; i++){
                if (T[i] >= 'A' && T[i] <= 'Z'){
                    TPosAlphabet[i] = T[i] - 65;
                }
                else{
                    TPosAlphabet[i] = 26;
                }
            }

        Je te donne deux exemples :

        - si le mot est MANHATTAN, TPosAlphabet[9] = {12,0,13,7,0,19,19,0,13}

        - si le mot est M@NH@TT@N, TPosAlphabet[9] = {12,26,13,7,26,19,19,26,13}

        Je sais qu'il y a ce rapport entre lettre et valeur numérique. Je l'ai d'ailleurs utilisé. J'ai décidé d'utiliser TPosAlphabet pour gérer "facilement" le passage vers l'ASCII Art en me disant "si la position est x (entre 0 [A] et 26 [?]) je vais chercher à chaque ligne les caractères entre (x * L) - 3 et (x * L)". Mais ce n'est peut être pas nécessaire effectivement (?) !

        -
        Edité par LucasLethuillier 12 août 2021 à 16:52:15

        • Partager sur Facebook
        • Partager sur Twitter
          12 août 2021 à 17:28:50

          On peut faire directement: caractère - 'A' et placer le résultat dans un int.
          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            12 août 2021 à 17:50:08

            PierrotLeFou a écrit:

            On peut faire directement: caractère - 'A' et placer le résultat dans un int.


            Il me semble que c'est plus ou moins ce que je fais avec :

            TPosAlphabet[i] = T[i] - 65;


            Non ?

            J'aurais aussi pu écrire 

            TPosAlphabet[i] = T[i] - 'A';



            • Partager sur Facebook
            • Partager sur Twitter
              12 août 2021 à 19:15:17

              La différence est que tu n'es pas obligé de savoir que le code de 'A' est 65
              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

              CodinGame - Puzzle ASCII Art

              × 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