Aller au contenu

Challenge récursive 2


(gile)

Messages recommandés

Salut,

 

Pour faire suite à ce sujet qui fait suite à celui-là, je propose un challenge (assez) facile pour aborder la récursivité dans un cadre où elle est incontournable.

 

Il s'agit simplement de définir une fonction qui retourne la liste des chemins de tous les dossiers et sous dossiers contenus dans un dossier (voir la fonction vl-directory-files).

Choisir un dossier avec des sous-dossiers à différents niveaux d'imbrication.

 

Avec cette arborescence :

http://gilecad.azurewebsites.net/Resources/arborescence.png

La fonction doit retourner cette liste :

  (
  "C:\\Temp\\dossier racine\\Dossier 1"
  "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1"
  "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Bidule"
  "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc"
  "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc\\Machin"
  "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.2"
  "C:\\Temp\\dossier racine\\Dossier 2"
  "C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.1"
  "C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.2"
 )

 

Merci à ceux qui l'ont déjà fait (ou qui savent le faire) de laisser chercher les autres.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile).

 

La récursivité est encore de la science fiction pour moi...

 

Même ta version "facile" du challenge de Patrick_35, ;)

 

Le niveau est trop haut... Dommage... :(

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

La récursivité est encore de la science fiction pour moi...

 

Même ta version "facile" du challenge de Patrick_35, ;)

 

Le niveau est trop haut... Dommage... :(

C'est justement le but du challenge. Se triturer les méninges.

 

Allez Denis, allez Denis, allez....

 

Allez Denis, allez Denis, allez....

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Yop

 

Merci à ceux qui l'ont déjà fait (ou qui savent le faire) de laisser chercher les autres.

 

Je vais donc m’abstenir sur celui la,(déja fait) surtout que je me remet sur l'autre, déjà résolu, mais je m'y colle n'ayant pas regarder les résultats même si il est tard et que Simone va gueuler.

Lien vers le commentaire
Partager sur d’autres sites

J'ai un peu de mal avec le récursif, il faut beaucoup réfléchir <_< .

Pour le moment je n'arrive que à afficher les dernier répertoires

(
  "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Bidule"
  "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc"
  "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc\\Machin"
  "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.2"
  "C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.1"
  "C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.2"
 )

 

et pas ceux là

(
  "C:\\Temp\\dossier racine\\Dossier 1"
  "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1"
  "C:\\Temp\\dossier racine\\Dossier 2"
 )

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

Lien vers le commentaire
Partager sur d’autres sites

Salut.

Allez Denis, allez Denis, allez....

Merci pour tes encouragements... ;)

 

Mais je n'arrive même pas à le "proser", alors en faire du code... :(

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

J'ai attendu avant de poster ma solution. Je sens que l"on peut faire mieux, mais en attendant...

(defun rch_che(rep / che lst)
 (defun che(rep)
   (setq lst (cons rep lst))
   (mapcar '(lambda(x)
      (che (strcat rep "\\" x))
    )
    (cddr (vl-directory-files rep "*.*" -1))
   )
 )
 (che rep)
 (reverse 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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

C'est malin l'utilisation d'une fonction auxiliaire à effet de bord (maitrisé), même si certains peuvent y voir une entorse à la pureté fonctionnelle (personnellement, j'emploie souvent ce procédé en C#).

 

Juste pour souligner ça, le mapcar, n'est pas nécessaire puisque la liste qu'il retourne n'est jamais utilisée et pourrait être remplacé par un foreach.

 

(defun rch_che(rep / che lst)
 (defun che (rep)
   (setq lst (cons rep lst))
   (foreach x (cddr (vl-directory-files rep "*.*" -1))
     (che (strcat rep "\\" x))
   )
 )
 (che rep)
 (reverse lst)
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Je m'aperçois que ce challenge n'est pas si facile, alors je propose, dans un premier temps, de chercher à retourner une liste de sous-liste qui reflète l'arborescence.

 

Exemple de résultat avec l'arborescence décrite plus haut :

("C:\\Temp\\dossier racine"
 ("C:\\Temp\\dossier racine\\Dossier 1"
   ("C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1"
     ("C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Bidule")
     ("C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc"
       ("C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc\\Machin")
     )
   )
   ("C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.2")
 )
 ("C:\\Temp\\dossier racine\\Dossier 2"
   ("C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.1")
   ("C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.2")
 )
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Du coup je met la mienne

 

(defun c:all-dir (/ alldir dir listdir)
(setq dir (getstring "\nSaisir le dossier Racine:"))
(defun alldir (dir)
(setq dir (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir)))
(append (mapcar '(lambda ( x ) (strcat dir "\\" x)) (vl-directory-files dir nil -1))
(apply 'append (mapcar '(lambda ( x )(if (not (wcmatch x ".,.."))
       (alldir (strcat dir "\\" x))))
       (vl-directory-files dir nil -1)
);Fin mapcar
   );Fin apply
);Fin append
);Fin alldir
(setq listdir (alldir dir))
);Fin all-dir

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Tu as les répertoires "." et ".." qui apparaissent dans la liste.

Pour éviter de les trouver, tu peux utiliser la fonction cdr + cdr = cddr pour le retour de la fonction vl-directory-files.

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Je pensais les avoir fait sautés avec (wcmatch x ".,.."), mais effectivement ils se sont rajouté à la fin des chemins.

 

En fait la difficultés du challenge, c'est le point dans le nom des dossiers, qui fait qu'on ne peut pas utiliser le filtre "*.*" ...

 

je regarde ta soluce tout à l'heure, merci

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Tu as les répertoires "." et ".." qui apparaissent dans la liste.

Pour éviter de les trouver, tu peux utiliser la fonction cdr + cdr = cddr pour le retour de la fonction vl-directory-files.

 

@+

 

Attention, cddr ne marche pas si la racine est un lecteur ("C:" par exemple).

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

bon, je n'ai pas réussi à faire un filtre correct dans la boucle récursive.

du coup je traite la liste finale.

 


(defun c:all-dir (/ alldir dir listdir)
(setq dir (getstring "\nSaisir le dossier Racine:"))
(defun alldir (dir)
(setq dir (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir)))
(append (mapcar '(lambda ( x ) (strcat dir "\\" x)) (vl-directory-files dir nil -1))
       (apply 'append (mapcar '(lambda ( x )(if (not (wcmatch x ".,.."))
       (alldir (strcat dir "\\" x))))
       (vl-directory-files dir nil -1)
       );Fin mapcar
   );Fin apply
);Fin append
);Fin alldir
(setq listdir (remove-doubles (mapcar '(lambda ( x ) (vl-string-right-trim "\\..,\\." x)) (alldir dir))))
);Fin all-dir

(defun remove-doubles (lst)

 (if lst (cons (car lst) (remove-doubles (vl-remove (car lst) lst)))

 )

)

Lien vers le commentaire
Partager sur d’autres sites

Il me semble que de traiter le lecteur seul, est une exception hors challenge, puisque qu'il est question de dossiers.

 

Mais c'est vrais que mon code n'est pas concis, et est une adaptation d'un code que j'utilise pour lister des fichiers, et pas des dossiers.

 

Je remercie en passant Lee Mac, mon autre mentor.

Lien vers le commentaire
Partager sur d’autres sites

Yop

 

Effectivement, j'avais essayer, mais j'avais du faire une fausse manip, cela fonctionne à la perfection.

 

(defun c:all-dir (/ alldir dir listdir)
(setq dir (getstring "\nSaisir le dossier Racine:"))
(defun alldir (dir)
(setq dir (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir)))
(append (mapcar '(lambda ( x ) (strcat dir "\\" x)) (cddr(vl-directory-files dir nil -1)))
       (apply 'append (mapcar '(lambda ( x )(if (not (wcmatch x ".,.."))
       (alldir (strcat dir "\\" x))))
       (cddr(vl-directory-files dir nil -1))
       );Fin mapcar
   );Fin apply
);Fin append
);Fin alldir
(setq listdir (alldir dir))
);Fin all-dir

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é