Patrick_35 Posté(e) le 8 septembre 2008 Posté(e) le 8 septembre 2008 Bonjour Un nouveau challenge :DLe but est de retrouver tous les sous-répertoires à partir d'une branche de l'arborescence.Si on indique la racine, on aura donc tous les répertoires du disque. Ceux qui ont déjà la solution pourront patienter jusqu'à demain ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Matt666 Posté(e) le 8 septembre 2008 Posté(e) le 8 septembre 2008 Houlà ça sent le vlisp... Out pour moi :casstet: "Chacun compte pour un, et nul ne compte pour plus d'un."
Patrick_35 Posté(e) le 8 septembre 2008 Auteur Posté(e) le 8 septembre 2008 Pas spécialement Pour t'aider, juste une fonction vl-directory-files.Le reste est en pur autolisp. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
ElpanovEvgeniy Posté(e) le 8 septembre 2008 Posté(e) le 8 septembre 2008 Bonjour :)Un sujet très intéressant!Toutes les variantes me sont très intéressantes... Ceux qui ont déjà la solution pourront patienter jusqu'à demain ;) Mes variantes vous sont familières... Evgeniy
Matt666 Posté(e) le 8 septembre 2008 Posté(e) le 8 septembre 2008 vl-directory-files.Merci Patrick_35 !Le problèm est que je n'utilise pas Autocad... Mais BricsCAd, et une ancienne version (jusqu'à ce que la nouvelle n'est plus ce bug affreux en lisp) qui n'utilise aucun VLISP... Je triche avec les fonctions équivalentes de (gile) (merci encore à lui), mais cette fonction n'est pas dispo...Sniff http://www.zwatla.com/emo/emo/1/em0900.gif "Chacun compte pour un, et nul ne compte pour plus d'un."
bseb67 Posté(e) le 9 septembre 2008 Posté(e) le 9 septembre 2008 Il y a aussi la bibliothèque doslib que j'utilise souvent, mais surtout pour la recherche de fichiers dans des répertoires ou faire de copies, c'est plus rapide que des enregistrer sous. J'attaque le challenge à midi, (et ca me fait penser que je n'ai pas encore attaqué mon super) a+ Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
zebulon_ Posté(e) le 9 septembre 2008 Posté(e) le 9 septembre 2008 Bonjour, (defun arbo (REPERT / LISTREP REP) ;; utilisation ;; (arbo "c:") ;; (arbo "c:\\rep1") ;; (arbo "c:\\rep1\\rep2") ;; etc ... (setq LISTREP (vl-directory-files REPERT nil -1)) (if (= (car LISTREP) ".") (setq LISTREP (cddr LISTREP)) ) (while LISTREP (setq REP (car LISTREP) LISTREP (cdr LISTREP) ) (print (strcat REPERT "\\" REP)) (arbo (strcat REPERT "\\" REP)) ) (princ) ) 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)
(gile) Posté(e) le 9 septembre 2008 Posté(e) le 9 septembre 2008 Salut, Bonne idée le print, j'avais déjà donné une réponse ici mais il s'agissait de retourner une liste. Le même écrit un peu différemment (une seule variable) : (defun GetFolders (path / c) (apply 'append (mapcar '(lambda (x) (cons (setq c (strcat path "\\" x)) (GetFolders c)) ) (vl-remove "." (vl-remove ".." (vl-directory-files path nil -1))) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 9 septembre 2008 Auteur Posté(e) le 9 septembre 2008 Merci à tous vous tous :D Matt666A quand une version full ;) ElpanovEvgeniyMes variantes vous sont familières...C'est toujours un plaisir de te lire :D bseb67J'attaque le challenge à midiDonc, on attends ton résultat :cool: (gile)Bravo pour ta routine, mais l'utilisation d'un append n'est pas trop gourmand ? zebulon_Aussi chapeau pour ta routine car j'ai écrit quelque chose qui y ressemble beaucoup(defun subf(ori / rep) (princ (strcat "\n" ori)) (foreach rep (vl-directory-files ori nil -1) (or (member rep '("." "..")) (subf (strcat ori "/" rep)) ) ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 9 septembre 2008 Posté(e) le 9 septembre 2008 mais l'utilisation d'un append n'est pas trop gourmand ? Comme je disais "il s'agissait de retourner une liste". Dans le même esprit pour un retour à la ligne de commande : (defun PrintFolders (path / c) (mapcar '(lambda (x) (print (setq c (strcat path "\\" x))) (PrintFolders c) ) (vl-remove "." (vl-remove ".." (vl-directory-files path nil -1))) ) (princ) ) En tout cas, Patrick_35, chapeau pour ta routine, j'aime beaucoup.Ça fait plaisir de voir d'autres s'amuser avec les fonctions récursives ;) [Edité le 9/9/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 9 septembre 2008 Posté(e) le 9 septembre 2008 Ça me rappelle ce sujet l'utilisation d'un append n'est pas trop gourmand ? C'est ce que j'avais utilisé à l'époque, et c'est vrai que ce n'est pas le plus performant suivant où débute l'exploration dans l'arborescence. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
ElpanovEvgeniy Posté(e) le 9 septembre 2008 Posté(e) le 9 septembre 2008 ElpanovEvgeniyMes variantes vous sont familières...C'est toujours un plaisir de te lire :D http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=13600 Evgeniy
ElpanovEvgeniy Posté(e) le 10 septembre 2008 Posté(e) le 10 septembre 2008 Je n'ai pas d'idées, pour l'amélioration du programme.La seule correction - a enlevé la variable superflue. (defun PrintFolders (path) ;;by (gile) (mapcar '(lambda (x) (PrintFolders (print (strcat path "\\" x)))) (vl-remove "." (vl-remove ".." (vl-directory-files path nil -1)) ) ) (princ) ) Evgeniy
zebulon_ Posté(e) le 10 septembre 2008 Posté(e) le 10 septembre 2008 Bonjour, Ça fait plaisir de voir d'autres s'amuser avec les fonctions récursivesUne fois qu'on a compris comment ça marche, on trouve cela forcément élégant. De plus, dans le cas qui nous intéresse, je vois mal comment on pourrait répondre à la question simplement sans utiliser la récursivité ? Je reprends à mon compte les mots des Patrick_35, au sujet du challenge 24 D'habitude, je vois plus facilement les itératives par rapport aux récursives, mais là je sèche sans faire une usine à gaz... 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 10 septembre 2008 Posté(e) le 10 septembre 2008 Une fois qu'on a compris comment ça marche, on trouve cela forcément élégant. De plus, dans le cas qui nous intéresse, je vois mal comment on pourrait répondre à la question simplement sans utiliser la récursivité ? :) Recursion - seulement un des accueils, mais non l'algorithme.Regarde la variante sans recursion et compare... (defun PrintFoldersInt (path) (setq path (list path)) (while (setq path (apply 'append (mapcar '(lambda (a) (mapcar '(lambda (b) (print (strcat a "\\" b))) (vl-remove "." (vl-remove ".." (vl-directory-files a nil -1)) ) ) ) path ) ) ) ) (princ) ) Evgeniy
bseb67 Posté(e) le 10 septembre 2008 Posté(e) le 10 septembre 2008 Salut, :( y a déjà plein de réponses, et malheureusement hier à midi j'ai du effectuer un dépannage qui m'a bouffé ma pause déjeuner :( . pour ce sujet c'est clair qu'un mode récursif parait évident et intuitif.Je vais tenter un mode itératif, mais avec le code court que vous avez donné, avec le super rapidemapcar, ca va être chaud de faire plus rapide. ;) Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
zebulon_ Posté(e) le 10 septembre 2008 Posté(e) le 10 septembre 2008 Regarde la variante sans recursion et compare... je regarde et les bras m'en tombent... apply, mapcar et la fonction lambda sont des choses que je n'utilise pas assez. Et c'est une faute quand on voit ce qu'il est possible de faire avec. 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 10 septembre 2008 Posté(e) le 10 septembre 2008 Zebulon: y a un truc bizarre, ta fonction ne marche pas chez moi :casstet: (edit1: ta fonction est récursive) Et je ne vois pas pourquoi, tu appelles vl-directory-files de la même façon que les autres.(edit2: j'y comprends plus rien :casstet: , maintenant ca marche) (gile), patrick_35, ElpanovEvgeniy: ok, Mais petits compléments:1 - vl-directory-files appelé sur nil comme répertoire, renvoie les répertoires dans mes documents.2 - il y a toujours "." et ".." en première et deuxième position, au premier abord, je pensais que faire un (cddr (vl-directory-files ....)) plutot qu'un vl-remove irai plus vite, et bien non, les temps sont les mêmes. Ces vl sont vraiment très très fort :cool: [Edité le 10/9/2008 par bseb67] [Edité le 10/9/2008 par bseb67] Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Patrick_35 Posté(e) le 12 septembre 2008 Auteur Posté(e) le 12 septembre 2008 ElpanovEvgeniyMes variantes vous sont familières...C'est toujours un plaisir de te lire :D http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=13600 J'ai la mémoire qui flanche :red: Je dois me faire vieux ;) Sinon, bravo pour la routine itérative @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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