Écrit par : Jaypee 5 Jul 2023, 19:09
Ça faisait longtemps !
Je n'expose pas le contexte dans lequel j'ai trouvé cet exemple, qui affiche une étoile, je vais juste le décortiquer rapidement.
CODE
' *' [1 + V∘.≤-V←B,0,⌽B←A,-A←⌽⍳4]
* *
** **
*** ***
**** ****
*****************
***************
*************
***********
*********
***********
*************
***************
*****************
**** ****
*** ***
** **
* *
La clé de la compréhension du code est juste un produit cartésien : Prenez un vecteur de valeurs numériques, placez le verticalement, puis horizontalement, et remplissez le tableau avec une opération de ligne à colonne, comme pour construire une table de multiplication.
Ici le vecteur est :
Code
V
4 3 2 1 ¯4 ¯3 ¯2 ¯1 0 ¯1 ¯2 ¯3 ¯4 1 2 3 4
Il y a des valeurs négatives avec le signe négatif APL en exposant à gauche du nombre
Et l'opération de ligne à colonne est, pour tous les couples de coordonnées valides (i, j), V(i) <= -V(j) ce qui s'écrit ainsi en APL :
CODE
V∘.≤-V
0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0
0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0
Ce tableau va servir à indicer une chaîne constituée d'un espace et d'un astérisque ' *', mais comme les indices commencent à 1, il faut ajouter 1 partout. Et le résultat a la même forme que le tableau d'indice.
Revenons un peu sur la construction du vecteur V :
Code
V
4 3 2 1 ¯4 ¯3 ¯2 ¯1 0 ¯1 ¯2 ¯3 ¯4 1 2 3 4
Il est composé de la génération des indices de 1 à 4, inversés par l'opérateur ⌽, qu'on range dans la variable A :
Code
A←⌽⍳4
A
4 3 2 1
On lui ajoute derrière, sa propre négation, et le tout est rangé dans B:
Code
B←A,-A
B
4 3 2 1 ¯4 ¯3 ¯2 ¯1
Enfin V est construit comme B, suivi de 0, suivi du miroir de B
Code
V←B,0,⌽B
V
4 3 2 1 ¯4 ¯3 ¯2 ¯1 0 ¯1 ¯2 ¯3 ¯4 1 2 3 4
Et finalement, l'indiçage de la petite chaîne par le produit cartésien de la relation V <= -V:
Code
' *'[1 + V∘.≤-V]
* *
** **
*** ***
**** ****
*****************
***************
*************
***********
*********
***********
*************
***************
*****************
**** ****
*** ***
** **
* *