Aller au contenu

Rechercher dans la communauté

Affichage des résultats pour « challenge » dans sujets.

  • Rechercher par étiquettes

    Saisir les étiquettes en les séparant par une virgule.
  • Rechercher par auteur

Type du contenu


Forums

  • Fonctionnement de ce site
    • Nouvelle règle pour les invités : plus d'écriture possible sans inscription
    • CADxp, comment ça marche?
    • CADxp, vos souhaits
    • Forum test
  • Emploi
    • Emploi, monde du travail
  • AutoCAD
    • AutoCAD 3D
    • AutoCAD 2020-2024
    • AutoCAD LT 2024
    • AutoCAD LT 2020-2023
    • AutoCAD 2019
    • AutoCAD LT 2019
    • AutoCAD 2018
    • AutoCAD LT 2018
    • AutoCAD 2017
    • AutoCAD LT 2017
    • AutoCAD avant 2017
    • AutoCAD LT avant 2017
    • Tutoriaux AutoCAD
    • AutoCAD, liste de souhaits
  • Autres logiciels de CAO
    • Microstation
    • IntelliPlus, IntelliCAD, CadIdesk
    • ZWCAD
  • Architecture, Bâtiment
    • Revit
    • AutoCAD Architecture
    • AutoCAD MEP
    • BIM
  • Mécanique
    • Inventor
    • SolidWorks
    • Creo (ex. Pro/Engineer)
    • Catia
  • SIG, Génie civil, Cartographie, VRD
    • Autodesk Map
    • VRD
    • Covadis
    • Infraworks 360
    • Mensura
    • AutoCAD Civil
    • Autopiste
    • SIG internet
  • Imagerie, animation, PAO, modélisation 3D
    • 3DSMAX
    • Création et retouche d'images
    • Sketchup
    • Autres logiciels d'infographie
    • Lumion 3D
  • Programmation
    • LISP et Visual LISP
    • VBA et VB
    • Personnalisation, macros, DIESEL
    • ObjectARX/DBX, C++, .NET, RealDWG
    • Programmer en s'amusant
    • Suggestions de développements
  • Trucs et astuces
    • AutoCAD trucs et astuces
    • Windows trucs et astuces
  • Matériel CAO
    • Ordinateurs
    • Périphériques d'entrée
    • Périphériques de sortie, impression
  • Divers
    • CAO, généralités
    • Echanges de fichiers
    • Organisation du travail
    • Visualisateurs, annotation
    • Pause café
    • Bibliothèques de composants
    • Formation
  • Logiciels connexes
    • Devis, métré, estimation, quantitatif
    • Calculs et simulation
  • Forums métier
    • Bâtiment
    • Infrastructures

Calendriers

Il n’y a aucun résultat à afficher.

Blogs

Il n’y a aucun résultat à afficher.


Rechercher les résultats dans…

Rechercher les résultats qui contiennent…


Date de création

  • Début

    Fin


Dernière mise à jour

  • Début

    Fin


Filtrer par nombre de…

Inscription

  • Début

    Fin


Groupe


AIM


MSN


Website URL


ICQ


Yahoo


Jabber


Skype


Location


Interests

  1. une idée de challenge un peu plus qu'intermédiaire pour les fanas des gestions de listes Elle me vient du problème posé par BonusCAD concernant la projection d'une polyligne 2D sur un modèle de terrain à facettes Soit une série de doublets de points correpondant à des segments de polyligne 3D à construire ((P1 P2) (P5 P6) (P9 P10) (P2 P3) (P7 P8) (P4 P5) (P6 P7).(P3 P4)......) il s'agit de les remettre dans l'ordre en faisant correspondre les débuts de doublet et les extrèmités (P1 P2) (P2 P3) (P3 P4) (P4 P5) (P6 P7) (P7 P8) (P8 P9) (P9 P10)...... dans un premier temps on pourra considérer que les doublets ne sont pas à inverser; dans un second temps on pourra imaginer avoir récupéré aussi bien (P5 P6) que (P6 P5) exemple (Sortlist '(((3.0 4.0 0.0) (3.0 6.0 0.0)) ((1.0 2.0 0.0) (1.0 4.0 0.0)) ((1.0 4.0 0.0) (3.0 4.0 0.0)) ((3.0 6.0 0.0) (4.0 7.0 0.0)) ((6.0 7.0 0.0) (6.0 4.0 0.0)) ((6.0 4.0 0.0) (7.0 3.0 0.0)) ((4.0 7.0 0.0) (6.0 7.0 0.0)) ((7.0 3.0 0.0) (9.0 3.0 0.0)) ((9.0 3.0 0.0) (10.0 5.0 0.0)) ((12.0 5.0 0.0) (12.0 3.0 0.0)) ((10.0 5.0 0.0) (12.0 5.0 0.0)) )) donne (((1.0 2.0 0.0) (1.0 4.0 0.0)) ((1.0 4.0 0.0) (3.0 4.0 0.0)) ((3.0 4.0 0.0) (3.0 6.0 0.0)) ((3.0 6.0 0.0) (4.0 7.0 0.0)) ((4.0 7.0 0.0) (6.0 7.0 0.0)) ((6.0 7.0 0.0) (6.0 4.0 0.0)) ((6.0 4.0 0.0) (7.0 3.0 0.0)) ((7.0 3.0 0.0) (9.0 3.0 0.0)) ((9.0 3.0 0.0) (10.0 5.0 0.0)) ((10.0 5.0 0.0) (12.0 5.0 0.0)) ((12.0 5.0 0.0) (12.0 3.0 0.0))) ce sont des points 2D mais çà doit marcher aussi avec les points 3D PS, je n'ai pas encore cherché donc je n'ai pas encore de solution Ps2 : Après réflexion, En fait, c'est assez simple... [Edité le 24/5/2007 par Didier-AD]
  2. Bonsoir, encore un challenge d'un niveau intermédiaire. Ceux qui connaissent déjà la réponse seraient gentil d'attendre demain soir pour donner leur réponse afin que les autres puissent chercher un peu Alors pour les autres, n'hésitez pas J'aimerai savoir si dans ma liste de chiffres, je n'ai que des nombres > à 5 et < à 10 '(6 6.5 7 8 8.5 9) --> T '(5 6 6.5 7 8 8.5 9) --> nil '(6 6.5 7 8 8.5 9 10) --> nil @+ ps : Ce n'est pas parce que j'ai lancé le sujet que je suis le seul à apporter aussi les réponses, c'est interactif ;)
  3. Ça n'est pas grave, Evgeniy, le challenge n'était pas si bon : trop facile pour ceux, comme toi, qui connaissaient la solution, et peut-être vraiment difficile pour certains. That don't matter, Evgeniy, the challenge wasn't so good; too easy for those, as you, who knew the solution, and may be really difficult for some others. Quelques explications. L'idée m'est venu en répondant à une demande sur un forum Autodesk, et je pensaiss que ça pouvait être un moyen pour aborder les manipulations de codes binaires avec les opérateurs logique. La fonction Boole est une fonction générale pour faire des opérations booléennes sur les bits (code binaires). Elle admet comme arguments plusieurs entiers dont le premier définit l'opérateur et les suivants sont les codes binaires sur lesquels se font les opérations. Les opérations Booléennes standard, AND, OR, XOR et NOR ont comme opérateur respectivement 1, 7, 6 et 8. Pour plus d'explications sur la fonction Boole (et aussi logand, logior et ~) voir dans l'aide aux développeurs ou ici. La solution de ce challenge résidait donc dans l'utilisation de l'opérateur XOR (ou exclusif, ou bien), qui permet d'éviter les tests logiques pour savoir si un bit est actif ou non. (Boole 6 n m) retourne la somme des codes binaire qui sont exclusivement dans n ou dans m. Exemple : (Boole 6 1 0) -> 1 (Boole 6 1 1) -> 0 Donc pour une variable comme ORTHOMODE, faire : (setvar "ORTHOMODE" (Boole 6 1 (getvar "ORTHOMODE"))) mtrra orthomode à 1 s'il était à 0 et inversement. De la même façon on peut activer/désactiver plusieurs accochages aux objets : (setvar "OSMODE" (Boole 6 6 (getvar "OSMODE"))) effectuera une basule sur les codes 2 et 4 (milieu et centre). On peut faire une routine dont les arguments sont le nom de la variable et la somme des codes binaire sur lesquels effectuer la bascule. (defun bascule (var bin) (setvar var (Boole 6 (getvar var) bin)) )
  4. Comme pour moi avec un niveau intermédiaire ! J'ai bien deux autres propositions de ce niveau, mais je ne suis pas certain qu'il y a beaucoup de réponses. Je pense que l'on a affaire soit à des gros débutants pour lequel c'est trop difficile ou les pros qui répondent en 5mn. Doser le niveau et la difficulté n'est pas aisé. :mad2: Je pense que le plus simple, c’est que les débutants proposent un challenge à leurs niveaux pour lequel d’ailleurs ils ne peuvent pas répondre, et aux autres de répondre afin que lesdits débutants puissent analyser les réponses, essayer de comprendre, et surtout, n’hésitant pas à poser des questions s’ils ne comprennent telle ou telle fonction ou la manière dont fonctionne la réponse. @+
  5. Bon, Il semble que je me sois "planté" avec ce challenge, plus de 260 visites ce jour, et seulement deux tentatives de réponses. L'exercice est peut-être trop difficile pour ceux qui s'estiment "débutants", ou dénigré par ceux qui auraient pu s'y pencher. L'idée que j'avais derrière la tête était d'amener à découvrir/comprendre la fonction mapcar. Chez moi cette découverte a été un grand pas dans ma compréhension du LISP et des traitements de listes. Je vais tenter de débrousailler un peu pour aider ceux qui voudrait "améliorer la routine proposée par lovecraft. mapcar fait passer comme argument à une fonction tous les éléments d'une ou plusieurs listes et retourne une liste dont chaque élément est le résultat de ces évaluations. Exemple : (mapcar '1+ '(3 4 5)) La fonction est 1+ qui incrémente de 1 l'argument qui lui est passé. Chaque élément de la liste (3 4 5) sera donc passé comme argument de la fonction 1+ ce qui équivaudrait à faire : (list (1+ 3) (1+ 4) (1+ 5)) et retourne donc (4 5 6) avec plusieurs listes, tous les éléments de même rang dans chaque liste sont passés comme argument à la fonction, ce qui permet, entre autre, d'ajouter des points (listes de coordonnées) Exemple : (mapcar '+ '(1 2 3) '(4 5 6) '(7 8 9)) ce qui équivaut à : (list (+ 1 4 7) (+ 2 5 8) (+ 3 6 9)) et retourne donc (12 15 18) En utilisant la fonction mapcar dans la routine donné par Lovecraft, outre le fait qu'elle serait plus courte et plus élégante, elle pourrait fonctionner aussi bien avec des points 2d (x y) qu'avec des points 3d (x y z). En espérant avoir éclairé quelques lanternes, à vos clavier ... Prochain épisode, l'utilisation de fonctions lambda avec mapcar ...
  6. Un nouveau challenge, que je dirais niveau intermédiaire, mais je trouve difficile de parler de "niveaux" tant les expériences de chacun sont diverses. Donc, merci à que ceux qui auraient une solution immédiate de laisser un peu chercher les autres ;) Il s'agit de faire une bascule sur un (ou des) code(s) binaire(s) d'une variable système. La réponse pourrait être la forme : (defun bascule (variable drapeau) ...) et fonctionner comme dans les exemples suivant. Exemple 1 : activer/désactiver le mode ortho (getvar "ORTHOMODE") -> 0 (bascule "ORTHOMODE" 1) (getvar "ORTHOMODE") -> 1 (bascule "ORTHOMODE" 1) (getvar "ORTHOMODE") -> 0 ... Exemple 2 : activer/désactiver différents modes d'accochage aux objet (ex : milieu,centre) (getvar "OSMODE") -> 7 (extrémité, milieu, centre) (bascule "OSMODE" 6) (getvar "OSMODE") -> 1 (extrémité) (bascule "OSMODE" 6) (getvar "OSMODE") -> 7 (extrémité, milieu, centre) ... ou (getvar "OSMODE") -> 3 (extrémité, milieu) (bascule "OSMODE" 6) (getvar "OSMODE") -> 5 (extrémité, centre) (bascule "OSMODE" 6) (getvar "OSMODE") -> 3 (extrémité, milieu) ... ou encore activer/désactiver tous les accrochages aux objets...
  7. Là encore, le produit vectoriel vient à la rescousse en effet, le produit vectoriel de deux vecteurs coplanaires mais non parallèles donne un vecteur qui est perpendiculaire au plan de ces deux vecteurs (pvectoriel '(1 0 0) '(0 1 0)) donne le vecteur '(0 0 1) Dans le challenge, j'ai précisé que les 3 points étaient dans le plan XY donc le produit vectoriel sera un vecteur orienté selon Z et les lois du produit vectoriel sont telles que (pvectoriel '(1 0 0) '(0 1 0)) donne le vecteur '(0 0 1) mais (pvectoriel '(0 1 0) '(1 0 0)) donne le vecteur '(0 0 -1) En examinant le signe de cette coordonnée en Z, on peut donc connaitre la position relative de ces deux vecteurs (defun pvectoriel (V1 V2) ; ajouter si nécessaire la coordonnée Z à V1 (if (not (caddr V1)) (setq V1 (append V1 (list 0)))) ; ajouter si nécessaire la coordonnée Z à V2 (if (not (caddr V2)) (setq V2 (append V2 (list 0)))) (list (- (* (cadr V1)(caddr V2)) (* (caddr V1) (cadr V2))) (- (* (car V1)(caddr V2)) (* (caddr V1) (car V2))) (- (* (car V1)(cadr V2)) (* (cadr V1) (car V2))) ) ) (defun estadroite (A B P / v) (setq v (pvectoriel (mapcar '- B A) (mapcar '- P A))) (cond ((minusp (caddr v)) -1) ((equal (caddr v) 0.0 1e-9) 0) (t 1) ) ) En plus, et ce n'est pas à négliger, la valeur absolue de la coordonnée en Z donne la surface du triangle ABP
  8. Salut, tiens, je l'avais pas vu ce challenge... J'utilise exactement ce que décris zebulon_ au détail près que je n'utilise pas le sinus, mais je test la valeur de l'angle (ce qui n'est pas plus simple ...) (if (and (> (- (angle p1 pt)(angle p1 p2)) 0) (< (- (angle p1 pt)(angle p1 p2)) pi)) (alert "gauche") (alert "droite") )
  9. En lançant ce "challenge" je doutais un peu de l'intérêt qu'il pouvait avoir et de celui qu'il pourrait susciter. Je suis doublement comblé, par le nombre des réponses et par le plaisir que j'ai eu à creuser ou à découvir les approches des uns et des autres. Merci à tous, c'est un vrai bonheur, et c'est pas fini... Quelques commentaires. Bred, Je suis toujours bluffé, non, vexé, que tu m'aies montré mon nez au milieu de ma figure. Didier, Je pense que l'expression (equal (apply '+ (pvectoriel (mapcar '- P2 P1) (mapcar '- P3 P4))) 0 1e-9), fort élégante au demeurant, n'est pas fiable pour évaluer si le vecteur est un vecteur nul. La somme des éléments de la liste peut être égale à 0 sans qu'ils soient forcément tous 0 Exemple avec : P1 (0 0 0) P2 (-1 0 -1) P3 (1 1 0) P4 (1 2 0) le produit vectoriel donne (1 0 -1) et l'expression retourne T alors que les droites sont perpendiculaires. Bonuscad, Le lien est très intéressant, on y trouve la méthode donnée par Didier avec le produit vectoriel et aussi une autre qui teste la "coplanéarité" de 4 points en utilsant astucieusement produit vectoriel et produit scalaire. J'y ai découvert qu'on pouvait calculer la surface d'un triangle avec le produit vectoriel. Lovecraft, Je persiste à dire que ton approche est très intéressante en ce sens qu'elle dispense d'étudier les projections des droites sur les 3 plans de référence. Tu n'est pas loin de l'aboutir, si tu as du mal, demande moi, je t'aiderais. Quant à la piste lancée par lecrabe (l'équation de la droite du plan y = Ax + B), elle s'avère encore plus laborieuse que celle qui consistait à comparer les angles des projections sur les plans de référence. Cela nécessite d'évaluer d'abord si les droites ne sont pas ce qu'on appelle en géométrie descriptive des droites particulières (perpendiculaires ou parallèles à un des plans de référence), parceque les coordonnées des points définissant ces droites entraineraient une division par 0 dans le calcul de la "pente" sur chacun des plans de référence.
  10. Bonsoir Encore un challenge mais qui change des listes Il s'agit de convertir un nombre en hexa et inversement ex : (hex 448) -> "1C0" ex : (dec "1C0") -> 448 ps : ne trichez pas en utilisant les fonctions vba ;) @+
  11. Enfin un challenge pour lequel j'ai la réponse du premier coup, et sans papier ni ordi !
  12. Pour ceux qui savent résoudre rien qu'en lisant ce nouveau défit, je leurs demande de bien vouloir patienter jusqu'à Lundi soir avant de donner leur solution afin de permettre aux autres de rechercher. Je pense qu'il est d'un niveau intermédiaire J'ai une liste qui se compose de cette manière (setq lst '(1 2 3 5 7 10 11 12 14 20 30 31 33 37 39 40 44 76 80)) J'aimerai un liste qui ne contienne que les chiffres pair @+
  13. Hello Voici un autre challenge (ou Routine Lisp à développer) que je ne sais pas résoudre ... Soit N polylignes 2D closes ou pas (d'au moins 3 sommets) : LWPOL , POL et Lissées ou Pas, Splinées ou Pas ... Sélection de ces N polylignes et reconstruction de toutes les polylignes nécessaires (en changeant le sens avec la routine R_PLINE de Gilles) pour CELLES qui tournent dans le sens des aiguilles de montre ! En clair je veux que toutes mes polylignes soient dans le sens TRIGONOMETRIQUE ! Routine R_PLINE.LSP de (gile) http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=10953#pid Merci d'avance de vos solutions ... Le Decapode
  14. Coucou *** Challenge BIS : Les 2 droites coplanaires sont elles perpendiculaires ? Coordonnées XY de l'intersection ? *** Challenge suivant dans l'espace 3D, mêmes questions: A mon avis, c'est surement plutôt de niveau Terminale S 2 droites passant par : - X1,Y1,Z1 et X2,Y2,Z2 d'une part - X3,Y3,Z3 et X4,Y4,Z4 d'autre part Les 2 droites 3D sont elles: - 1) Coplanaires ? - 2) Parallèles ? - 3) En intersection (Miracle Niveau 2), coordonnées XYZ de l'intersection ? - 4) En intersection et en plus perpendiculaires (Miracle Niveau 3), coordonnées XYZ de l'intersection ? Le Decapode (qui a tout oublié de son Bac C, il y a 30 ans environ) [Edité le 20/5/2007 par lecrabe]
  15. Très très intéressant, BRAVO :D Je vois encore 3 petits dysfonctionnements comme pour Didier, 1) ta routine tient compte du sens dans lequel sont donnés les points de chaque droite, il ne faudrait pas. Une droite du plan XY à 30° est parallèle à une autre à 210° Essaye avec les points donnés dans mon dernier message, les deux devraient retourner T. 2) il pourrait être utile de faire un test pour s'assurer que P1 n'est pas confondu avec P2, de même pur P3 et P4 afin d'éviter un message d'erreur du style : "; erreur: division par zéro" 2) comme le dit Didier, comparer des points 3d nécessite souvent une petite tolérance, il faut utiliser equal plutôt que eq avec un fuzz (regarde la routine que j'ai posté). Sinon, pour gagner quelques lignes : (and ...) retourne T si aucune des expressions évaluées n'a retourné nil, autrement nil. Tu n'as donc pas besoin de faire un (if ...) Encore BRAVO, une fois mis au propre, je pense que tu auras écrit la routine la plus concise de ce challenge.
  16. bonjour le voici corrigé (defun parallel-p (P1 P2 P3 P4) (if(and (eq (angle P1 P2) (angle P3 P4)) (eq (/ (-(caddr P1) (caddr P2)) (distance P1 P2)) (/ (-(caddr P3) (caddr P4)) (distance P3 P4)))) T nil ) ) Normalement il fonctionne bien je viens de le tester sur autocad avec les exemples que tu as donner plus haut il compare l'angle donc le gisement et l'inclinaison soit la pente (ce qui confirme que les droites sont sur le meme plan. ert je pense que j'ai reussi le challenge car je n'utilise que les parametre que tu as defini dans l'ennoncé. @plus
  17. Rassurez vous, il ne s'agit pas de politique mais d'un petit challenge Il s'agit d'écrire une fonction qui permettra de savoir si un point P est à droite ou à gauche d'une direction donnée par deux points A et B (droiteougauche P A B) doit retourner 1 si P est à droite de AB, -1 si P est à gauche de AB 0 si P est aligné avec A et B
  18. :mad: Pendant que je corrige, je ne peux pas faire le "challenge 4" C'est bien essayé tous les deux mais... Bred essaye avec (parallel-p '(-1 0 0) '(1 0 0) '(0 -1 1) '(0 1 1)) Patrick avec (parallel-p '(0 0 0) '(1 0 0) '(0 1 0) '(1 1 1)) Vos solutions ne fonctionnent pas si les droites ne sont pas coplanaires. PS : Bred, tu aurais pu faire directement (if (inters p1 p2 p3 p4 nil) nil T ) [Edité le 19/5/2007 par (gile)]
  19. Donc, toujours dans la serie. (demain, j'en donne un plus facile pour un niveau intermédiaire) J'ai une chaine de caractère que je souhaite incrémenter de +1 ex : "aaa" --> "aab" ex : "aaz" --> "aba" ex : "aef" --> "aeg" ex : "azz" --> "baa" ex : "zzz" --> "aaaa" Et pour ceux qui y arrivent, il serait interessant de pouvoir aussi incrémenter la chaine de caractère de +3 ou +10 par exemple ps : Merci à BonusCad de ne pas donner la réponse au premier challenge et perso, je n'ai pas reussi le suivant, sauf par une boucle, mais pas top :( @+
  20. bonsoir, hem dis moi gile.... juste une p'tite idée si nous comparons juste le gisement des droites, cela suffit pour determiner si elles sont parralleles? donc pas besoin de faire des calculs interminables .... @plus Ps :je suis entain de plancher pour le challenge debutant ;) et merci pour les conseils qui m'aident à progresser.
  21. Allez, un peu de géométrie. Il s'agit de faire une routine qui évalue si deux droites, définies respectivement par les points p1, p2 et p3, p4 sont parallèles. Exemple : (parallel-p p1 p2 p3 p4) retourne T si p1 p2 est parallèle à p3 p4 PS : p1 p2 p3 p4 sont des points 3d, bien sûr.
  22. Suite à ce message, je propose un premier "challenge" en LISP réservé aux "débutants". Il faudrait donc que les lispeurs confirmés s'abstiennent dans un premier temps de répondre pour laisser les autres proposer leurs solutions, disons au moins jusqu'à Lundi soir ou Mardi matin dans la mesure où il y aurait déjà plusieurs réponses. Le but : - donner une routine qui retourne le centre de gravité d'un triangle défini par ses 3 sommets (p1, p2 et p3). - que le résultat soit juste (bien sûr) - essayer de faire le plus concis et élégant possible. Exemple : (defun cen-grav (p1 p2 p3) ...) tel que, avec : (setq pt1 '(10.0 5.0)) (setq pt2 '(4.0 15.0)) (setq pt3 '(-2.0 -5.0)) (cen-grav pt1 pt2 pt3) retourne (4.0 5.0) Le sujet a, il me semble déjà été traité, mais je le pense qu'il est intéressant pour ceux qui ne connaîtraient pas de solution à priori (encore une fois, les autres s'abstiennent de répondre). [Edité le 19/5/2007 par (gile)]
  23. Salut, Je vais essayer de commenter/expliquer la routine test3. http://img205.imageshack.us/img205/5536/challengeup8.png Cette routine est un exercice de style qui utilise une forme récursive. À ceux qui ne savent rien de la récursivité, je recommande de lire d'abord ce sujet et cet exemple. (defun test3 (lst / sub) ... Comme toutes les routines de ce "challenge", test3 admet un argument : la liste dont il faut compter les éléments. Elle admet aussi une variable locale, la sous routine sub ; l'utilisation de la récursivité impose de définir un fonction (defun ...) pour pouvoir la rappeler. Déclarer la sous routine comme variable locale permet de remettre la variable sub à nil à la fin de l'exécution de test3 donc de libérer de la mémoire et d'éviter tout conflit avec une autre routine du même nom. La sous routine sub admet 2 arguments : la liste à traiter (lst) et un entier (n) qui servira à compter chaque occurence d'un même terme. Pour comprendre ce qui se passe ensuite dans la sous routine, je propose de prendre un exemple avec une liste plus courte mais significative et de faire un "pas à pas". (setq lst '("a" "c" "b" "c" "a")) Le premier appel à sub se situe dans test3 : (sub (vl-sort lst ' On peut le traduire : (sub '("a" "a" "b" "c" "c") 1) La première évaluation dans sub (if (cadr lst) ... est la condition d'arrêt si elle n'est pas remplie (si la liste ne comporte qu'un élément) Lors de ce premier appel, la condition est remplie, on passe à la deuxième évaluation : (if (equal (car lst) (cadr lst)) ... qui détermine si les deux premiers éléments sont identiques. Cette condition étant remplie, il se produit un nouvel appel à sub avec de nouveaux arguments (sub (cdr lst) (1+ n)) qu'on peut traduire : (sub '("a" "b" "c" "c") 2) Deuxième appel (sub '("a" "b" "c" "c") 2) : la première condition est remplie mais pas la seconde : le premier et le deuxième éléments de la liste sont différents. Il se produit un nouvel appel à sub sous une forme différente (cons (cons (car lst) n) (sub (cdr lst) 1)) qu'on peut traduire : (cons '("a" . 2) (sub '("b" "c" "c") 1)) Troisième appel (sub '("b" "c" "c") 1) : même chose que précédemment, (sub '("b" "c" "c")) retourne (cons '("b" . 1) (sub '("c" "c") 1)) on en est donc à : (cons '("a" . 2) (cons '("b" . 1) (sub '("c" "c") 1))) Le quatrième appel (sub '("c" "c") 1) retourne (sub '("c") 2) (cons '("a" . 2) (cons '("b" . 1) (sub '("c") 2))) Cinquième appel (sub '("c") 2) : la première condition n'est pas remplie, c'est la condition d'arrêt qui au lieu de faire un nouvel appel à sub, évalue (list (cons (car lst) n)), soit (list ("c" . 2)). On a donc au final une expression qui ne contient plus d'appel à sub : (cons '("a" . 2) (cons '("b" . 1) (list ("c" . 2)))) C'est la fin de la phase dite "d'empilement". L'évaluation de cette expression ("dépilement") retourne : (("a" . 2) ("b" . 1) ("c" . 2)) Voilà, j'espère ne pas avoir été trop confus. [Edité le 19/5/2007 par (gile)]
  24. Merci pour l'importance que vous avez apporté a ma demande. en ce qui me concerne j'ai qqes notions en lisp et en VBA donc en cherchant un peu voir beaucoup j'arrive à comprendre ce que vous faites , un p'tit bémol, je ne connais rien en Vlisp (je suis entrain d'aborder le sujet) Et pour reprendre la reponse de gile, je comprends bien qu'il s'agisse d'un challenge concernant les plus aguéri.Mais l'idée d'un challenge pour ce qui début et une merveilleuse idée. Encore merci à vous trois. PS: J'attends que l'un d'entre vous lance un challenge pour les débutants.
  25. Donc, pour continuer dans la serie ;) J'ai une liste qui se compose de cette manière (setq lst '("a" "b" "c" "f" "a" "c" "f" "g" "t" "b" "c" "a")) J'aimerai connaitre le nombre de ""a, de "b", etc... sous la forme d'une liste et tant qu'à faire dans l'ordre alphabétique. @+
×
×
  • 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é