C de l’art

par Vincent Poulailleau - 3 minutes de lecture - 554 mots

Oui il est possible de faire de l’art en programmant. En voici un exemple, un joli code source permet de générer un donut animé :

             k;double sin()
         ,cos();main(){float A=
       0,B=0,i,j,z[1760];char b[
     1760];printf("\x1b[2J");for(;;
  ){memset(b,32,1760);memset(z,0,7040)
  ;for(j=0;6.28>j;j+=0.07)for(i=0;6.28
 >i;i+=0.02){float c=sin(i),d=cos(j),e=
 sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c*
 h*e+f*g+5),l=cos      (i),m=cos(B),n=s\
in(B),t=c*h*g-f*        e;int x=40+30*D*
(l*h*m-t*n),y=            12+15*D*(l*h*n
+t*m),o=x+80*y,          N=8*((f*e-c*d*g
 )*m-c*d*e-f*g-l        *d*n);if(22>y&&
 y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]=
 ".,-~:;=!*#$@"[N>0?N:0];}}/*#****!!-*/
  printf("\x1b[H");for(k=0;1761>k;k++)
   putchar(k%80?b[k]:10);A+=0.04;B+=
     0.02;}}/*****####*******!!=;:~
       ~::==!!!**********!!!==::-
         .,~~;;;========;;;:~-.
             ..,--------,*/

Et voici le résultat à l’exécution sur mon PC :

Donut en console
Donut en console

Si on ajoute de la coloration syntaxique au code source, cela donne :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
             k;double sin()
         ,cos();main(){float A=
       0,B=0,i,j,z[1760];char b[
     1760];printf("\x1b[2J");for(;;
  ){memset(b,32,1760);memset(z,0,7040)
  ;for(j=0;6.28>j;j+=0.07)for(i=0;6.28
 >i;i+=0.02){float c=sin(i),d=cos(j),e=
 sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c*
 h*e+f*g+5),l=cos      (i),m=cos(B),n=s\
in(B),t=c*h*g-f*        e;int x=40+30*D*
(l*h*m-t*n),y=            12+15*D*(l*h*n
+t*m),o=x+80*y,          N=8*((f*e-c*d*g
 )*m-c*d*e-f*g-l        *d*n);if(22>y&&
 y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]=
 ".,-~:;=!*#$@"[N>0?N:0];}}/*#****!!-*/
  printf("\x1b[H");for(k=0;1761>k;k++)
   putchar(k%80?b[k]:10);A+=0.04;B+=
     0.02;}}/*****####*******!!=;:~
       ~::==!!!**********!!!==::-
         .,~~;;;========;;;:~-.
             ..,--------,*/

On y voit donc une ruse pour la fin du code, qui n’est en fait constitué que de commentaires.

Et si finalement, l’indentation est corrigée en automatique avec VS Code :

Le code source devient :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
k;
double sin(), cos();
main()
{
  float A =
            0,
        B = 0, i, j, z[1760];
  char b[1760];
  printf("\x1b[2J");
  for (;;)
  {
    memset(b, 32, 1760);
    memset(z, 0, 7040);
    for (j = 0; 6.28 > j; j += 0.07)
      for (i = 0; 6.28 > i; i += 0.02)
      {
        float c = sin(i), d = cos(j), e = sin(A), f = sin(j), g = cos(A), h = d + 2, D = 1 / (c * h * e + f * g + 5), l = cos(i), m = cos(B), n = s\
in(B),
              t = c * h * g - f * e;
        int x = 40 + 30 * D *
                         (l * h * m - t * n),
            y = 12 + 15 * D * (l * h * n + t * m), o = x + 80 * y, N = 8 * ((f * e - c * d * g) * m - c * d * e - f * g - l * d * n);
        if (22 > y &&
            y > 0 && x > 0 && 80 > x && D > z[o])
        {
          z[o] = D;
          ;
          ;
          b[o] =
              ".,-~:;=!*#$@"[N > 0 ? N : 0];
        }
      } /*#****!!-*/
    printf("\x1b[H");
    for (k = 0; 1761 > k; k++)
      putchar(k % 80 ? b[k] : 10);
    A += 0.04;
    B +=
        0.02;
  }
} /*****####*******!!=;:~
       ~::==!!!**********!!!==::-
         .,~~;;;========;;;:~-.
             ..,--------,*/

C’est plus lisible, nous distinguons la structure du code, mais le nommage des variables ne facilite pas la compréhension du code. Par contre, cela permet de faire un joli code en forme de donut !

Plus de détails par l’inventeur de ce code : site de l’inventeur

J’en profite pour signaler que je propose des formations que vous pouvez découvrir ici : https://www.lecalamar.fr/formations/. Vous y trouverez des formations pour tous les niveaux et sur différents thèmes. Je peux tout à fait vous accompagner dans une formation en C ou C embarqué, n’hésitez pas à me contacter.

Tags :