tableau ascii

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

tableau ascii

Message non lu par maurice » jeu. 4 déc. 2014, 02:31

Bonjour, j'ai voulu faire une table des caractère ASCII.
Je me suis confronté aux caractères spéciaux \LaTeX.
Du coup, le programme, simple au départ, est devenu complexe avec plein de tests.

Figure asymptote 9c5b6ec0e69510a5366ddf464ce7302f
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. unitsize(1.1cm);
  2.  
  3. defaultpen(fontsize(10pt));
  4.  
  5. int[] speciaux={35, 36, 37, 38, 92, 94, 95, 123, 125, 126};
  6.  
  7. string table(int n, int p) {
  8. string l1, l2;
  9. for(int i=n; i<p; ++i) {
  10. if(i==34) {l1 = l1 + '"'; l1 += " &"; l2 += format("%i", i) + " &";}
  11. else {
  12. if(i==92) {l1 = l1 + "\textbackslash"; l1 += " &"; l2 += format("%i", i) + " &";}
  13. else {
  14. if(i==94) {l1 = l1 + "\textasciicircum"; l1 += " &"; l2 += format("%i", i) + " &";}
  15. else {
  16. if(i==35 | i ==36 | p==37 | i==38 | i==92 | i==95 | i==123 | i==125 | i==126) {
  17. l1 = l1 + '\\' + format("%c", i); l1 += " &";
  18. l2 += format("%i", i) + " &";
  19. } else {
  20. l1 += format("%c", i); l1 += " &";
  21. l2 += format("%i", i) + " &";
  22. }
  23. }
  24. }
  25. }
  26. }
  27. if(p==35 | p ==36 | p==37 | p==38 | p==92 | p==95 | p==123 | p==125) {
  28. l1 = l1 + '\\' + format("%c", p); l1 += " \\";
  29. l2 += format("%i", p) + " \\";
  30. } else {
  31. if (p==126) {
  32. l1 += " \textasciitilde \\";
  33. l2 += format("%i", p) + " \\";
  34. } else {
  35. l1 += format("%c", p) + " \\";
  36. l2 += format("%i", p) + " \\";
  37. }
  38. }
  39. write(l1);
  40. write(l2);
  41. return "\begin{tabular}{|l|*{18}{c|}} \hline Caract\`ere &" + l1 + "\hline Code &" + l2 + " \hline \end{tabular}";
  42. }
  43.  
  44. label(table(51,68), (0,0));
  45. label(table(69,86), (0,-1));
  46. label(table(87, 103), (0,-2));
  47. label(table(104,118), (0,-3));
  48. label(table(119,126), (-3,-4));


Euh, Y'a pas plus simple ?...

Il reste le problème de l'alignement et des lignes de même longueur (usepackage("tabularx")) ?

Merci

Bruno
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: tableau ascii

Message non lu par GM » jeu. 4 déc. 2014, 08:24

Bonjour,
maurice a écrit :Euh, Y'a pas plus simple ?...
J'ai envie de répondre que ouiiii... en regardant la longueur du script :-) mais sans avoir le temps de chercher maintenant (période de copies et conseils de classes).

Quelques commentaires après une lecture rapide et un seul essai du code proposé :
  • "speciaux" est défini et non utilisé ;
  • dans ta logique de la gestion des cas spéciaux, tu n'as pas songé à interdire de passer en paramètre un n inférieur à 32 ? J'imagine que tu t'es dit que c'est pour toi et que tu sais que les caractères imprimables commencent à 32 mais puisque l'on en est à mettre le code sur le net... peut-être faudra t-il ajouter un warning (et un remplacement par n=32) pour toute tentative de n<32 ;
  • Je crois que tu as un problème avec la valeur 37.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: tableau ascii

Message non lu par GM » jeu. 4 déc. 2014, 09:56

Manque de temps mais j'apporte tout de même une source d'inspiration... pour ce qui a été apparemment l'une de tes pistes de recherche (je fais allusion à ta variable inutilisée : speciaux) :

Code : Tout sélectionner

int[]    CODspeciaux={35, 36, 37, 38};
string[] CARspeciaux={"c1", // Chaine de substitution pour 35
                      "c2", //                             36
                      "c3", //                             37
                      "c4"  //                             38
                      }; 
int  rang;                      
bool isSPECpossible=true;
for(int i=32; i<42; ++i) {
   rang = search(CODspeciaux,i);
   ((rang==-1)||(!isSPECpossible)) ? write(format("%c",i)) : write(CARspeciaux[rang]);
   if(rang==CODspeciaux.length-1) isSPECpossible = false;
}
Une obligation : les entiers de CODspeciaux doivent être rangés dans l'ordre !
Image
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: tableau ascii

Message non lu par GM » jeu. 4 déc. 2014, 17:45

ATTENTION !

Un gros bémol à mon exemple ci-dessus : "search" fonctionne dans mon exemple... mais je viens de songer à d'autres cas où cela n'irait pas en l'état.
Pour le comprendre :

Code : Tout sélectionner

int[] CODspeciaux={35, 36, 37, 38, 92, 94, 95, 123, 125, 126};
write(search(CODspeciaux,33));
write(search(CODspeciaux,34));
write(search(CODspeciaux,35));
write(search(CODspeciaux,37));
write(search(CODspeciaux,38));
write(search(CODspeciaux,39));
write(search(CODspeciaux,91));
write(search(CODspeciaux,92));
write(search(CODspeciaux,126));
write(search(CODspeciaux,127));
write(search(CODspeciaux,1270));

Code : Tout sélectionner

Process started >>>
-1
-1
0
2
3
3
3
4
9
9
9
<<< Process finished.
La fonction de recherche dans la liste sera à revoir !
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: tableau ascii

Message non lu par maurice » ven. 5 déc. 2014, 00:28

Bonjour, merci pour toutes ces précisons. J'avis bien pensé à utuliser search mais ne voyais pas commengt m'en servir.
GM a écrit :La fonction de recherche dans la liste sera à revoir !
Problème contourné grace à

Code : Tout sélectionner

if(search(ord_speciaux, i-1)==search(ord_speciaux, i))
Voici une proposition.

Figure asymptote 8feaa220b1ed49f3b3fa8a2809e44acf
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. unitsize(1.1cm);
  2.  
  3. defaultpen(fontsize(10pt));
  4.  
  5. int[] ord_speciaux={34, 35, 36, 37, 38, 92, 94, 95, 123, 125, 126};
  6. string[] car_speciaux={'"', "\#", "\$", "\%", "\&", "\textbackslash", "\textasciicircum", "\textunderscore", "\{", "\}", "\textasciitilde"};
  7.  
  8.  
  9. string table(int n, int p) {
  10. string l1, l2;
  11. if(n<32) {write("indice minimum 32"); return table(32,p);}
  12. if(p>126) {write("indice maximum 126"); return table(n,126);}
  13. for(int i=n; i<p; ++i) {
  14. if(search(ord_speciaux, i-1)==search(ord_speciaux, i)) {
  15. l1 += format("%c", i) + " & ";
  16. l2 += format("%i", i) + " & ";
  17. } else {
  18. l1 += car_speciaux[search(ord_speciaux, i)] + " & ";
  19. l2 += format("%i", i) + " & ";
  20. }
  21. }
  22. if(search(ord_speciaux, p-1)==search(ord_speciaux, p)) {
  23. l1 += format("%c", p) + " \\";
  24. l2 += format("%i", p) + " \\";
  25. } else {
  26. l1 += car_speciaux[search(ord_speciaux, p)] + " \\ ";
  27. l2 += format("%i", p) + " \\";
  28. }
  29. return "\begin{tabular}{|l|*{"+format("%i", p-n+1)+"}{p{.35cm}|}} \hline" +
  30. " Caract\`eres & " + l1 + " \hline " +
  31. "Code & " + l2 + " \hline \end{tabular}";
  32. }
  33.  
  34.  
  35. label(table(30,50), (0,0), E);
  36. label(table(51,69), (0,-1), E);
  37. label(table(70,88), (0,-2), E);
  38. label(table(89,107), (0,-3), E);
  39. label(table(108,126), (0,-4), E);
  40. // label(table(121,150), (0,-5), E);


Reste la largeur des colonnes. Ça serait mieux si elles avaient même largeur et de n'avoir que 4 lignes !

Bruno

Edit : les avertissements marchent bien !

Edit2 : avec un p{.4cm} c'est ok sauf que les éléments du tableau ne sont plus centés (sur le formum .35cm à cause de la taille de l'image) !
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: tableau ascii

Message non lu par GM » ven. 5 déc. 2014, 20:35

Quelques suggestions :
  1. utilisation de tabularx ;
  2. inutile de refaire un appel de la fonction pour n<32 et p>126 ;
  3. le choix entre " & " et " \\ " ne nécessite pas de doubler le code ;
  4. un placement correct de l'affectation de l2 évite de la dupliquer ;
  5. définition d'un nouveau type de colonne pour le centrage ;
  6. recours à @{} pour un padding à 0 ;
  7. utilisation de string(...) quand il ne s'agit que de convertir un nombre en chaine.

Figure asymptote b718795663a70f08ff632d80bbd3eae8
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. unitsize(1cm);
  2. usepackage("tabularx");
  3. defaultpen(fontsize(10pt));
  4. int[] ord_speciaux={34, 35, 36, 37, 38, 92, 94, 95, 123, 125, 126};
  5. string[] car_speciaux={'"', "\#", "\$", "\%", "\&", "\textbackslash", "\textasciicircum", "\textunderscore", "\{", "\}", "\textasciitilde"};
  6.  
  7. string table(int n, int p) {
  8. string l1, l2, etnl;
  9. if(n<32) {write("indice minimum 32"); n=32;}
  10. if(p>126) {write("indice maximum 126"); p=126;}
  11. for(int i=n; i<=p; ++i) {
  12. etnl = (i!=p) ? " & " : " \\ ";
  13. if(search(ord_speciaux, i-1)==search(ord_speciaux, i)) {
  14. l1 += format("%c", i) + etnl;
  15. } else {
  16. l1 += car_speciaux[search(ord_speciaux, i)] + etnl;
  17. }
  18. l2 += format("%i", i) + etnl;
  19. }
  20. return "\newcolumntype{M}{>{\centering\arraybackslash}X}" +
  21. "\begin{tabularx}{15cm}{|l|*{"+string(p-n+1)+"}{@{}M@{}|}} \hline " +
  22. "Caract\`ere & " + l1 + " \hline " +
  23. "Code & " + l2 + " \hline \end{tabularx}";
  24. }
  25. label(table(30,50), (0,0), E);
  26. label(table(51,69), (0,-1), E);
  27. label(table(70,88), (0,-2), E);
  28. label(table(89,107), (0,-3), E);
  29. label(table(108,126), (0,-4), E);
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: tableau ascii

Message non lu par maurice » mar. 9 déc. 2014, 01:45

Merci pour les conseils ; ils sont tous recevables et il y en a quelques uns auxquels j'avais pensé.
C'est vrai qu'on s'attache peut être trop facilement au résultat visuel sans forcément essayer d'optimiser le code.
Après, dans le quotidien du cours de maths au lycée, on ne rencontre pas fréquemment d'illustrations qui demandent beaucoup de reflexion. Je reste quand même satisfait de mon

Code : Tout sélectionner

if(search(ord_speciaux, i-1)==search(ord_speciaux, i))
merci encore.

Bruno
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

Répondre