zebulon_ Posté(e) le 27 août 2008 Posté(e) le 27 août 2008 Bonjour, on s'est déjà pris la tête avec des tris sur des listes. C'est un sujet similaire, car je souhaite obtenir le minimum d'une liste avec une fonction qu'on va appeler min-list. Quand on a :(setq L '(5 3 2 8 10 5 0 -3 8 -3)) on obtient : (min-list L)-3 Là, c'est facile, puisqu'il suffit de faire un tri et de prendre le premier de la liste. Là ou je voudrais corser la chose c'est en demandant la même chose sur une liste de listes, comme sur cet exemple : (setq L '(1 (2 4 6 0) (3 -1 (2 -5)) 4 5 6)) où (min-list L) doit donner -5 AmicalementVincent [Edité le 27/8/2008 par zebulon_] C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
(gile) Posté(e) le 27 août 2008 Posté(e) le 27 août 2008 Super, un challenge !!! EDIT : hier soir, dans l'enthousiasme provoqué chez moi par un nouveau challenge intéressant, j'avais posté une réponse. Je déplace momentanément cette réponse (quelque part sur le site...) len attendant qu'il y ait d'autres réponses. [Edité le 28/8/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 28 août 2008 Auteur Posté(e) le 28 août 2008 Bonjour, un petit indice : c'est un challenge où on peut (où on doit...) s'intéresser à la récursivité. Autre indice : dans la condition d'arrêt j'ai utilisé la fonction (atom article). Mais on peut aussi avoir une préférence pour (listp article). J'avais omis de préciser qu'il s'agissait d'une liste de nombres, ce qui permet l'utilisation de la fonction (min nombre nombre ...) AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
bseb67 Posté(e) le 28 août 2008 Posté(e) le 28 août 2008 Ca y est, la fonction est faite. :D Bonjour,un petit indice : c'est un challenge où on peut (où on doit...) s'intéresser à la récursivité. c'est le cas Autre indice : dans la condition d'arrêt j'ai utilisé la fonction (atom article). Mais on peut aussi avoir une préférence pour (listp article).pas utilisé J'avais omis de préciser qu'il s'agissait d'une liste de nombres, ce qui permet l'utilisation de la fonction (min nombre nombre ...) liste d'entiers ou entiers et ou réels? oui, c'est vrai qu'il y a la fonction min, mais pas dans ma première version. je vais essayer de faireun code avec elle. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
zebulon_ Posté(e) le 28 août 2008 Auteur Posté(e) le 28 août 2008 Bonjour, chaque nombre peut être un réel ou un entier. La fonction min renvoie un réel si un des arguments est un réel, sinon elle renvoie un entier.Associé à apply, min donne quelque chose de pas mal(apply 'min '(5 3 2 0 -1.5))-1.5 On pourrait aussi utiliser la fonction de tri vl-sort (car (vl-sort '(5 3 2 0 -1.5) '<))-1.5 l'avantage c'est que la liste pourrait être alphanumérique (ce qu'on sait gérer avec vl-sort mais pas avec min)(car (vl-sort '("c" "d" "a") '<))"a" Maintenant, il ne reste "que" la récursivité AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
ElpanovEvgeniy Posté(e) le 28 août 2008 Posté(e) le 28 août 2008 http://autolisp-exchange.com/forum/showpost.php?p=271&postcount=6 (defun test (lst fun) (if (cdr lst) (test (cons (fun (car lst) (cadr lst)) (cddr lst)) fun) (car lst) ) ;_ if ) ;_ defun (test '(5 3 2 8 10 5 0 -3 8 -3) min) ;=> -3 (test '(5 3 2 8 10 5 0 -3 8 -3) max) ;=> 10 (test '(5 3 2 8 10 5 0 -3 8 -3) +) ;=> 35 (test '(5 3 2 8 10 5 0 -3 8 -3) -) ;=> -25 (test '(5 3 2 8 10 5 0 -3 8 -3) *) ;=> 0 (test '(5 3 2 8 10 5 0 -3 8 -3) /) ;=> error: divide by zero [Edité le 28/8/2008 par ElpanovEvgeniy] Evgeniy
Patrick_35 Posté(e) le 28 août 2008 Posté(e) le 28 août 2008 Bonjour D'habitude, je vois plus facilement les itératives par rapport aux récursives, mais là je sèche sans faire une usine à gaz... Comme le bal commence :)(defun min-lst(lst) (apply 'min (mapcar '(lambda(x) (if (listp x) (min-lst x) x)) lst)) ) Et en reprennant l'idée d'ElpanovEvgeniy(defun min-max(lst fun) (apply fun (mapcar '(lambda(x) (if (listp x) (min-max x fun) x)) lst)) )(min-max '(1 (2 4 6 0) (3 -1 (2 -5)) 4 5 6) 'min) --> 5(min-max '(1 (2 4 6 0) (3 -1 (2 -5)) 4 5 6) 'max) --> 6 ElpanovEvgeniy Your lisp don't work(test '(1 (2 4 6 0) (3 -1 (2 -5)) 4 5 6) min) --> ; erreur: type d'argument incorrect: numberp: (2 4 6 0) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bseb67 Posté(e) le 28 août 2008 Posté(e) le 28 août 2008 Voici mon premier jet, donc sans le min: ;--------------------------------------; ; nom: min_list_bseb67_v1 ; ; role: cherche et renvoie le minimum ; ; d'une liste d'entiers ou de ; ; réels ; ; param: liste => liste d'entiers ou de; ; de réels ; ; retour: un entier et le minimum ; ; date: 28/08/2008 ; ; BLAES Sébastien ; ;--------------------------------------; (defun min_list_bseb67_v1( liste / res e tmp) ; le resultat c'est le premier élément (setq res (nth 0 liste)) ; si jamais ce n'est pas un entier, c'est que c'est une liste ; donc on prend le premier élément dans cette sous liste (while (or (/= (type res) 'INT) (/= (type res) 'REAL)) (setq res (nth 0 res)) ); while ; on va rechercher le minimum dans liste (mapcar (function (lambda (e) (if (= (type e) 'LIST) ; si c'est une sous-liste on recherche le minimum dedans (if (< (setq tmp (min_list_bseb67_v1 e)) res) (setq res tmp) ) (if (< e res) (setq res e) )))) liste) res ) ; min_list_bseb67_v1 n'utilisant pas le min, il me faut chercher le premier nombre. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
(gile) Posté(e) le 28 août 2008 Posté(e) le 28 août 2008 Ma réponse (donnée précipitamment hier soir, puis cachée ici) est la même que celle donnée par Patrick_35 (defun min-list (lst) (apply 'min (mapcar (function (lambda (x) (if (listp x) (min-list x) x ) ) ) lst ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 28 août 2008 Auteur Posté(e) le 28 août 2008 Vous êtes trop forts... (defun min-list (ll) (if (atom ll) ll (if (null (cdr ll)) (min-list (car ll)) (min (min-list (car LL)) (min-list (cdr LL))) ) ) ) Voilà ce que j'avais en magasin. C'est moins bien qu'avec le mapcar, il suffit de faire un trace de la fonction pour s'en apercevoir. Sinon, en m'inspirant (très fortement) de ce que vous avez faits, on pourrait aussi écrire (defun min-listv (lst) (car (vl-sort (mapcar (function (lambda (x) (if (listp x) (min-listv x) x ) ) ) lst ) '<) ) ) histoire que ça marche pour tout type de liste. AmicalementVincent [Edité le 28/8/2008 par zebulon_] C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
ElpanovEvgeniy Posté(e) le 28 août 2008 Posté(e) le 28 août 2008 ElpanovEvgeniy Your lisp don't work(test '(1 (2 4 6 0) (3 -1 (2 -5)) 4 5 6) min) --> ; erreur: type d'argument incorrect: numberp: (2 4 6 0) @+ Oui, j'ai montré seulement la partie de la tâche. :) Evgeniy
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