S'il y a moyen de faire mieux, ça m'étonnerait que ça soit beaucoup plus, donc au final même longeur en caractères, mais surtout c'est beaucoup plus long d'un point de vue sémantique. Les transformations fonctionnelles successives de tableau nous forcent à tout garder en tête avant d'avoir un truc, contrairement au style impératif qui nous permet de gérer les étapes au fur et à mesure comme dans la description intuitive « à chaque fois qu'on tombe sur un 'O', on affiche la lettre correspondant au numéro de colonne ».
Le code J, par contre, est moins intuitif à expliquer : on construit un tableau identique à la chaîne de caractères de la carte mais avec des 1 à la place des O et des 0 à la place de tout le reste ('O'=]), ensuite on multiplie ça avec un tableau de même longueur construit avec des indices croissants (fonctions composées i.@#@]) modulo 27 (fonction |) pour les retours à la ligne, puis on sélectionne avec la fonction copy #~ (similaire à filter ici) les cases différentes de 0 (0~:]), qui correspondent aux cases où il y avait un O (faut suivre le fil des transformations !), puis on ajoute 65 pour avoir les numéros des caractères, pour enfin appliquer u: au résultat et obtenir les caractères à partir des numéros.
Pour ce genre de trucs, je préfère un langage prévu pour ça comme Perl :-) La charge cognitive du code perl est beaucoup moindre pour quelqu'un qui s'y connait dans les deux langages, je pense (même si je pourrais pas totalement l'assurer vu que je suis pas un expert en J non plus).
[^] # Re: Mes premières lignes de code professionnelles
Posté par anaseto . En réponse au journal Des nouvelles de Fortran. Évalué à 3. Dernière modification le 06 mai 2020 à 12:14.
En J, successeur modernisé d'APL, ça donne :
S'il y a moyen de faire mieux, ça m'étonnerait que ça soit beaucoup plus, donc au final même longeur en caractères, mais surtout c'est beaucoup plus long d'un point de vue sémantique. Les transformations fonctionnelles successives de tableau nous forcent à tout garder en tête avant d'avoir un truc, contrairement au style impératif qui nous permet de gérer les étapes au fur et à mesure comme dans la description intuitive « à chaque fois qu'on tombe sur un 'O', on affiche la lettre correspondant au numéro de colonne ».
Le code J, par contre, est moins intuitif à expliquer : on construit un tableau identique à la chaîne de caractères de la carte mais avec des 1 à la place des O et des 0 à la place de tout le reste (
'O'=]), ensuite on multiplie ça avec un tableau de même longueur construit avec des indices croissants (fonctions composéesi.@#@]) modulo 27 (fonction|) pour les retours à la ligne, puis on sélectionne avec la fonction copy#~(similaire à filter ici) les cases différentes de 0 (0~:]), qui correspondent aux cases où il y avait un O (faut suivre le fil des transformations !), puis on ajoute 65 pour avoir les numéros des caractères, pour enfin appliqueru:au résultat et obtenir les caractères à partir des numéros.Pour ce genre de trucs, je préfère un langage prévu pour ça comme Perl :-) La charge cognitive du code perl est beaucoup moindre pour quelqu'un qui s'y connait dans les deux langages, je pense (même si je pourrais pas totalement l'assurer vu que je suis pas un expert en J non plus).