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
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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
La différence est que tu n'es pas obligé de savoir que le code de 'A' est 65
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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.