Un challenge de programmation LISP

@gilecad nous propose un petit challenge sur CADxp, à vos claviers ! (répondez sur CADxp)

Un jeu d’enfant pour les IA (sans doute?) mais comme le but est de réfléchir par soi-même :smile: je publierais dans quelques temps lorsque les êtres humains auront répondu :wink: les différentes réponses données par les IA avec une analyse de chaque méthodologie si entre temps nous n’avons pas de réponse avec l’assistance des IA.

Evident pour @gilecad mais je le précise quand même ici, si vous demandez l’assistance d’une IA, dites le bien, bien sûr… :grin: sinon c’est pas du jeu ! :innocent:

Et bien sûr répondez sur CADxp, pas ici.

Comme promis, après que plusieurs participants au challenge aient donné des solutions, voici mes réflexions sur ce challenge:

  1. Le challenge initial, posté par (gile), consiste à extraire les nombres d’une chaîne de caractères en AutoLISP.

  2. Plusieurs participants proposent des solutions :

    • bonuscad utilise une approche basée sur le mapcar et la manipulation de listes.
    • didier propose une solution utilisant str2lst et des fonctions de manipulation de chaînes.
    • GEGEMATIC partage un code plus ancien et complexe.
    • (gile) présente deux solutions :
      a) Une version récursive avec deux fonctions auxiliaires (ping et pong).
      b) Une version concise utilisant les expressions régulières.
    • VDH-Bruno propose plusieurs approches, dont une utilisant la fonction read et une autre avec un accumulateur.
  3. Les participants discutent des avantages et inconvénients de chaque approche, notamment en termes de robustesse et de gestion des cas particuliers (comme les points, les signes négatifs, etc.).

  4. La discussion met en lumière la complexité du problème, en particulier pour gérer tous les cas possibles (fractions, unités accolées aux nombres, etc.).

  5. Les participants apprécient le défi intellectuel et l’opportunité d’apprendre de différentes approches.

  6. La solution utilisant les expressions régulières de (gile) est reconnue comme particulièrement élégante et concise.

  7. La discussion soulève des questions sur l’interprétation de certains cas limites (comme « 1/3 m3 ») et la difficulté de créer une solution universelle sans connaître le domaine d’application spécifique.

Comme vous le devinez, le résumé ci-dessus est généré par IA…

Alors, laissez-moi vous partager mes réflexions, issues de mon humble cerveau cette fois-ci :smiley:. Lorsque j’ai vu ce défi pour la première fois, j’ai immédiatement pensé – comme beaucoup d’entre nous – qu’une solution algorithmique passerait par une boucle classique. Je me suis aussi dit que ce genre de boucle pourrait poser problème, car elle examine chaque caractère individuellement, hors de son contexte. Or, c’est précisément là que réside le problème : cette méthode exclut les caractères voisins (avant ou après) du caractère étudié (le contexte), ce qui complique l’analyse.

L’autre solution, qui semble être la plus concise, c’est l’utilisation des expressions régulières, comme l’a montré Gilles. Cela fonctionne très bien dans l’exemple qu’il a donné, et probablement dans la plupart des cas et on peut difficilement faire plus concis. Cependant, je vois deux inconvénients à cette méthode. Le premier, c’est qu’elle nécessite de charger des bibliothèques externes, ce qui va au-delà du code extrêmement concis que Gilles nous présente, la concision n’est donc qu’apparente. Le second problème est de savoir si cette méthode fonctionne avec toutes les chaînes de caractères, et pas seulement avec l’exemple donné par Gilles. Et là, la réponse est non, comme on pouvait s’y attendre, comme Gilles certainement (je lis dans son esprit :innocent:) pouvait s’y attendre, et comme VDH-Bruno l’a souligné.

En somme, cette solution fonctionne la plupart du temps, mais ne couvre pas tous les cas. Bien entendu, je ne doute pas que Gilles pourrait adapter son expression régulière pour gérer plus de cas. Toutefois, comme l’a exprimé VDH-Bruno, il reste une question : jusqu’à quel point une telle expression peut-elle vraiment traiter tous les cas possibles ? Ce challenge, qui semblait simple au départ, peut rapidement devenir complexe. En programmation algorithmique, traduire cela en code AutoLISP peut devenir verbeux.

Quand j’ai vu l’exemple de VDH-Bruno, qui n’était pas résolu par les solutions proposées, je me suis dit qu’il y avait deux manières d’aborder ce problème. La première : utiliser un cerveau humain (pourquoi pas, soyons fous)?, capable d’extraire des valeurs numériques sans difficulté dans les exemples donnés, à condition que le problème soit présenté de façon claire et exhaustive. Et un cerveau humain n’a aucun mal à résoudre ce challenge :stuck_out_tongue:. La deuxième option ? Évidemment, faire appel à une IA (mon dada).

Je me suis donc amusé à copier-coller le challenge de Gilles et à le soumettre à deux IA : ChatGPT et Claude. Le résultat était intéressant, mais pas extraordinaire. Ces IA ont bien produit du code AutoLISP fonctionnel (pas de plantage à l’exécution), mais pas tout à fait adapté au défi. Cela dit, elles ont fourni des explications assez détaillées, utiles pour les débutants comme pour les programmeurs plus expérimentés. Au final, ces IA ne donnent pas toujours une réponse directe. Elles ne sont pas conçues pour écrire du code parfait, mais elles peuvent être d’une aide précieuse pour les développeurs, c’est une certitude. J’en parlais ici.

Alors, je me suis demandé : pourquoi résoudre ce défi uniquement par un programme AutoLISP ? Bien sûr, par respect pour la proposition de Gilles :wink:. Mais après avoir lu les commentaires de VDH-Bruno, je me suis dit : pourquoi ne pas poser la question à une IA, en la faisant raisonner comme un humain plutôt que simplement coder ? J’ai donc écrit un prompt et demandé à Claude de proposer une solution. Voilà le résultat. Gardez en tête que les IA ne répondent pas toujours la même chose à une même question. Ceci est une réponse parmi une infinité d’autres:

Ma question (mon prompt) à Claude:
Extrait toutes les valeurs numériques de cette chaîne, qu’elles soient entières ou réelles, positives ou négatives, écrite sous forme fractionnaire ou sous forme de notation scientifique et donne moi le résultat sous la forme d’une liste de nombres entre parenthèses: " Volume 1/3 m3 tous les 10m²"

Sa réponse:
Voici la liste des valeurs numériques extraites de la chaîne donnée :

(1/3, 10)

Cette liste contient :

  • 1/3 : une fraction représentant le volume
  • 10 : un nombre entier représentant la surface en mètres carrés

Notez que l’exposant 3 du mètre cube n’est pas repris. Cela ne parait pas illogique et il aurait fallu adapter la question pour le prendre en compte. Notez aussi qu’il a détecté un volume et une surface.

Bon, nous constatons que ce challenge est un jeu d’enfant pour une IA (comme il l’aurait été pour un être humain).

En conclusion:

Je ne vais pas, à l’occasion de ce challenge et de mon exploration des IA, relancer la discussion sur des questions comme : « Les IA sont-elles intelligentes ? » ou « Imitent-elles le cerveau humain ? ». Nous avons déjà abondamment débattu de ces sujets, aussi bien sur CADxp ainsi que sur d’autres forums et dans d’actualité.

La solution proposée par une IA, en l’occurrence, ne répond pas naturellement au défi posé par Gilles, et nous en convenons tous. Cependant, j’ai trouvé extrêmement intéressant d’élargir cette discussion sur les IA, et je demande humblement – mais avec une certaine insistance :yum: – à ceux d’entre vous, même les plus réticents à ces technologies, de prêter attention à cette réflexion.

Elle soulève deux questions passionnantes à mon avis : premièrement, personne ne sait exactement comment fonctionnent les IA, pas même leurs créateurs (si, si, je vous assure). C’est une caractéristique unique de cette technologie. Par conséquent, je ne peux naturellement pas vous expliquer quel algorithme a été utilisé pour que l’IA, ici Claude, propose une solution. Je ne peux donc pas non plus vous dire si la solution était exacte, ni comment la corriger pour qu’elle le soit. Je ne pourrais y parvenir que par essais et erreurs, ce qui nous éloigne de l’idée initiale du challenge, qui consiste à concevoir d’abord un algorithme mentalement, comme Gilles l’a fait, puis à le programmer en AutoLISP (ou dans un autre langage, d’ailleurs).

Nota bene: la solution en Python est aussi concise que celle de Gilles en AutoLISP.

Même si je ne fais pas partie de ceux qui ont contribué directement sur le forum à ce petit défi intéressant, j’ai profité de l’occasion pour voir ce que les IA auraient à dire ou à enseigner sur le sujet. Ce qui est fascinant. Je n’ai pas rapporté ici les solutions proposées par ChatGPT ou Claude en termes d’algorithmique pure et d’AutoLISP, mais si cela intéresse quelqu’un, je peux le faire.

Vous pouvez également le vérifier par vous-même, car ces IA ne se contentent pas de vous fournir du code ; elles expliquent en détail comment l’algorithme a été conçu. Cela dit, je ne l’ai pas fait ici parce que, tout simplement, le code proposé ne fonctionnait pas.

En conclusion, je pense fermement que les programmeurs, quel que soit le langage qu’ils utilisent, ne peuvent pas ignorer totalement les IA. Même si je comprends qu’on puisse être réticent à leur égard, c’est un fait incontournable. Les IA sont et seront utilisées par les programmeurs, par ceux qui vous le diront honnêtement, comme par… les autres. Et, selon moi, il est rarement sage d’ignorer un fait sociétal, technique ou scientifique, comme l’apparition des IA grand public il y a environ deux ans (bien que ces technologies soient beaucoup plus anciennes). Cela reviendrait à se priver d’une réflexion sur l’évolution de la technologie, surtout dans un domaine aussi fascinant que le lien entre IA et fonctionnement du cerveau humain.

Je suis curieux d’entendre vos réflexions, ici ou sur CADxp. :eyes:

En réponse à VDH-Bruno, je change légèrement le prompt pour répondre stricto sensu au challenge :yum::