Aller au contenu

[Challenge] Extraire les nombres d'une chaîne de caractères


(gile)

Messages recommandés

il y a 18 minutes, Patrick Emin a dit :

Oui, tout à fait, il suffirait d'adapter le prompt pour exclure les fractions, moi je l'avais explicitement demandée. (réponse sur mon site)

Perso, j'aurais préféré une conversion en valeur réelle, c'est un choix 😉

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

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".

il y a une heure, VDH-Bruno a dit :

Perso, j'aurais préféré une conversion en valeur réelle

Ç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é).

  • Upvote 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Citation

je pense que mêler l'IA à ce sujet est une vraie pollution (au sens propre comme au figuré).

Excusez, mais je veux réagir brièvement à ce ce sujet.

l'I.A. est pour moi du même acabit que les calculateur automobile.

Citation

Vous avez un défaut d'alimentation avec l'ODB: il faut changer la rampe d'injection.

Merci le mécano de mes deux, c'est la pompe de gavage et c'est pas le même prix! (vécu)

Je vous laisse réfléchir aux diagnostiques de ces "intelligences" et celui du pseudo mécanicien aussi.

Bien à vous.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é