Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

J'ai fais quelques recherches sur le site, mais je n'ai pas trouvé. Ce n'est pas impossible que cela est été déjà évoqué.

 

Ma problématique:

J'ai une liste de nombre réel (pas forcément dans un ordre croissant ou décroissant) du style:

'(7090.35 6081.96 5049.83 4031.35 3030.6 2028.35 1021.77 0.0 23926.9 23109.3 
22129.8 21145.7 20131.1 19128.6 18127.2 17130.9 16131.5 15110.7 14088.1 13104.4 
12085.2 11084.0 10088.8 9090.96 8092.54)

 

De cette liste je voudrais extraire le nombre immédiatement inférieur ET supérieur.

Par exemple avec 2556.63 comme valeur de départ obtenir l'encadrement '(2028.35 3030.6) ou même leur position (exploitable par nth) soit '(5 4)

 

Si vous avez un lien à me proposer ou une idée! J'ai pas trop le temps pour faire un challenge (mais je saurais m'y résoudre à défaut de proposition) :rolleyes:

Merci à ceux qui me feront gagner du temps.

 

NB: Jamais de nombre négatif dans ma liste, zéro peut être présent; la plus part du temps mais pas toujours.

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

Posté(e)

(setq lst '(7090.35 6081.96 5049.83 4031.35 3030.6 2028.35 1021.77 0.0 23926.9 23109.3 22129.8 21145.7 20131.1 19128.6 18127.2 17130.9 16131.5 15110.7 14088.1 13104.4 12085.2 11084.0 10088.8 9090.96 8092.54))
(setq tbl (vl-sort lst '<))
(mapcar '(lambda(x / n) (setq n (- (length tbl) (length (member x tbl))))
		(cond
		  ((zerop n)
		    (list nil (nth n tbl) (nth (1+ n) tbl))
		  )
		  ((eq n (length tbl))
		    (list (nth (1- n) tbl) (nth n tbl) nil)
		  )
		  (T
		    (list (nth (1- n) tbl) (nth n tbl) (nth (1+ n) tbl))
		  )
		)
)
lst
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

J'ai trouvé une discussion similaire, en plus c'est moi qui l'avais lancé. :(rires forts):

 

Sauf que ça concernait les entiers, je vais voir si je peux remanier le code...

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

Posté(e)

Toujours des rapides sur CadXp, merci Patrick_35

 

Je verrais de plus près dans la soirée, ou demain.

Edit:

Je viens de regarder rapidement, tu classes ma liste et me fais des encadrements avec les nombres de cette liste.

 

Je cherche juste l'encadrement avec un nombre qui ne fais PAS partie de la liste d'origine.

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

Posté(e)

Salut,

 

Pour le fun :

 

(defun encadre (num lst / inf sup)
 (foreach n lst
   (cond
     ((< n num)
      (setq inf
      (if inf
	(max n inf)
	n
      )
      )
     )
     ((> n num)
      (setq sup
      (if sup
	(min n sup)
	n
      )
      )
     )
   )
 )
 (list inf sup)
)

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

Posté(e)

Que dire? Juste pour le fun c'est exactement ça!

 

Juste pour ma convenance personnelle (pour ma suite de code), j'ai modifié le test de STRICTEMENT < ou >.

 

Merci de ton coup de main, je ne pense pas que j'aurais réussi à faire aussi concis sans voir un exemple... :unsure:

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

Posté(e)

Bonjour,

 

En lisant vos réponses, une variante très "lispienne" (ou devrais-je plutôt dire très "gillienne") m’a traversé l’esprit, donc pour le fun et le plaisir :

 

(defun encadre (num lst / inf sup funsup)
 
 (defun funsup (sup n num)
   (if (> n num)
     (defun funsup (sup n num) (> sup n num))
   )
 )
 
 (foreach n lst
   (cond ((< inf n num) (setq inf n)) ; borne inf
         ((funsup sup n num) (setq sup n)) ; borne sup
   )
 )
 
 (list inf sup)
)

 

Amicalement Bruno

Apprendre => Prendre => Rendre

Posté(e)

Ça fonctionne fort bien aussi...

 

En tout cas votre coup de main m'a permis de réaliser un travail très facilement.

Cela m'a servi découper des linéaires de routes sous AutocadMap en réaffectant automatiquement les nouvelles données d'objet curviligne (PR+ abscisses) aux entités sectionnées en tenant compte des positionnement des points routier.

 

Donc un lisp très spécifique et adapté à ma base de données.

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

Posté(e)

Ça fonctionne fort bien aussi...

C’est heureux car je n’ai rien changé à l’algorithme proposé par (gile), ce n’est qu’un jeu de réécriture des conditionnelles, d’ailleurs à la relecture pour ce cas particulier au jeu de la concision et de l'efficacité, on gagnerait à redéfinir la fonction funsup comme ceci:

 

(defun encadre (num lst / inf sup funsup)  
 (defun funsup (sup n num) (if (> n num) (setq funsup >)))  
 (foreach n lst
   (cond ((< inf n num) (setq inf n)) ; borne inf
         ((funsup sup n num) (setq sup n)) ; borne sup
   )
 )  
 (list inf sup)
) 

 

 

En tout cas votre coup de main m'a permis de réaliser un travail très facilement.

C’est un échange, sur un plan personnel le sujet m’a offert la pause récréative dont j'avais grandement besoin, merci à toi :) .

Apprendre => Prendre => Rendre

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é