Aller au contenu

Classement

Contenu populaire

Affichage du contenu avec la meilleure réputation le 06/10/2024 dans Messages

  1. Comme promis, je donne ma version récursive "plus concise". C'est la même que la troisième proposition de @VDH-Bruno en un peu moins concise mais insensiblement plus "rapide" puisqu'elle fait un appel récursif de moins dans les cas d'un nombre ou d'un point suivi d'un chiffre et un peu plus robuste puisqu'elle contrôle aussi la présence d'un point dans nombre en cours de reconstitution. (defun extraireNombres (str / loop) (defun loop (lst dot acc) (cond ((and (null lst) (null acc)) nil) ((isDigit (car lst)) (loop (cdr lst) dot (cons (car lst) acc)) ) ((and (isHyphen (car lst)) (isDigit (cadr lst)) (null acc)) (loop (cddr lst) dot (cons (cadr lst) (cons (car lst) acc))) ) ((and (not dot) (isDot (car lst)) (isDigit (cadr lst)) acc) (loop (cddr lst) T (cons (cadr lst) (cons (car lst) acc))) ) (acc (cons (read (vl-list->string (reverse acc))) (loop (cdr lst) nil nil)) ) (T (loop (cdr lst) dot acc)) ) ) (loop (vl-string->list str) nil nil) ) La même fonction peut être écrite avec une boucle (while ...) et beaucoup de (setq ...). (defun extraireNombres (str / lst num dot nums) (setq lst (vl-string->list str)) (while lst (cond ((isDigit (car lst)) (setq num (cons (car lst) num) lst (cdr lst) ) ) ((and (isHyphen (car lst)) (isDigit (cadr lst)) (null num)) (setq num (cons (cadr lst) (cons (car lst) num)) lst (cddr lst) ) ) ((and (isDot (car lst)) (isDigit (cadr lst)) (not dot) num) (setq num (cons (cadr lst) (cons (car lst) num)) lst (cddr lst) dot T ) ) (num (setq nums (cons (read (vl-list->string (reverse num))) nums) num nil dot nil lst (cdr lst) ) ) (T (setq lst (cdr lst)) ) ) ) (if num (setq nums (cons (read (vl-list->string (reverse num))) nums)) ) (reverse nums) ) Concernant la prise en compte de certains caractères (comme la barre de fraction), j'aurais dû être plus clair en précisant "la liste des nombres entiers et réels". Ça peut faire l'objet d'un autre challenge ou d'un ajout à celui-ci... Sinon, désolé @Patrick Emin, mais je pense que mêler l'IA à ce sujet est une vraie pollution (au sens propre comme au figuré).
    1 point
  2. @bonuscad Merci, les grands esprits se rencontrent, j'ai eu la même réflexion, le problème et que 1/2 peut être considéré comme une valeur fractionnaire et 1 / 2 / 3 / 4 / 5 comme une énumération, et c'est la que je vais faire plaisir à @Patrick Emin . @Patrick Emin Je viens de parcourir rapidement ton article, pour moi une utilisation intéressante des IA, c'est qu'elles réussissent assez bien à contextualiser une donnée dans un texte, suffit de voir les traducteurs automatique qui ne cessent de s'alimenter et donc de progresser. Sur ce type de problème une solution efficiente serait de laisser au programmeur le traitement ce qui n'est pas compliqué en soi, et de déléguer à une AI le soin de reformater les données en fonction d'un standard compréhensible pour le traitement. (Nb: sur le retour de l'IA, en lisp 1/3 est un symbole (non une valeur numérique) et 10 un nombre entier 😉).
    1 point
  3. Bonjour, @bonuscad Bonne fête!😄 @didier Je ne suis pas convaincu que se soit le challenge qui éveille l'intérêt des anciens du forum, mais plutôt le type de donnée à traiter qui intimide les moins expérimentés. Extraire des données d'une chaine de caractère avec un formatage qui n'est pas codifié de façon rigoureuse est de mon point de vue un problème bien complexe à traiter et donne du code bien fastidieux à écrire, si on ne maitrise pas comme @(gile) les expressions régulières qui sont de mon point de vu la panacée. Si la donnée est issue d'un tableur type Excel, nous avons un formatage parfait (libellés, nombres, unités ect...) très facilement interprétable pour un programme Si la donnée est issue d'un traitement de texte cela devient beaucoup plus compliqué à interprété, ex: 10.2 mètre cube, 10.2 m3, 10.2m3. Que doit on traiter? (12.2) ou (12.2 3). De même que considère t'on comme une valeur numérique une fraction doit elle être vu comme une valeur numérique exemple 1/3 doit donner 0.33333 ou 1 & 3 et les exemple et contre exemple peuvent être très nombreux. D'ailleurs pour illustrer le propos j'invite à tester la donnée suivante: " Volume 1/3 m3 tous les 10m²" avec la version de @(gile) et les expressions régulières... A+ Bruno
    1 point
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité