bonuscad Posté(e) le 6 octobre 2014 Posté(e) le 6 octobre 2014 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) 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
Patrick_35 Posté(e) le 6 octobre 2014 Posté(e) le 6 octobre 2014 (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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 6 octobre 2014 Auteur Posté(e) le 6 octobre 2014 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
bonuscad Posté(e) le 6 octobre 2014 Auteur Posté(e) le 6 octobre 2014 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
(gile) Posté(e) le 6 octobre 2014 Posté(e) le 6 octobre 2014 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
bonuscad Posté(e) le 6 octobre 2014 Auteur Posté(e) le 6 octobre 2014 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
VDH-Bruno Posté(e) le 9 octobre 2014 Posté(e) le 9 octobre 2014 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
bonuscad Posté(e) le 9 octobre 2014 Auteur Posté(e) le 9 octobre 2014 Ç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
VDH-Bruno Posté(e) le 10 octobre 2014 Posté(e) le 10 octobre 2014 Ç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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant