Matt666 Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 Cadeau de noël !!! :) Petit challenge pas très dur, mais intéressant, je trouve... Donc tout le monde sur le pont ! Il s'agit de supprimer des éléments au sein d'une liste (encore un challenge sur les listes !!). Un exemple est toujours plus probant :Une liste : (1 2 3 4 5 6 7 8 9 10 11 12 23)La routine retourne la même liste sans le 7 8 9. Donc : (1 2 3 4 5 6 10 11 12 23) A l'attaque !!! PS : Ce challenge est un peu visé... Lili, lovecraft et consorts, à vous de jouer !! Allez-y tranquillement, et puis si vous avez besoin d'un coup de main, ya qu'à demander :D ! Bon courage..A bientot !Matt. [Edité le 4/12/2007 par Matt666] "Chacun compte pour un, et nul ne compte pour plus d'un."
Bred Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 Salut,Petit challenge pas très dur,C'est le peu que l'on puisse dire : un fonction permet de faire cela.Il suffit de regarder dans l'aide, dans les fonctions de traitement de liste.... La seule astuce est les différentes manières de traiter le nombre d'éléments à supprimer : repeat, while, mapcar.... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Matt666 Posté(e) le 4 décembre 2007 Auteur Posté(e) le 4 décembre 2007 Oui, mais si on a une liste comme celle-ci :(0 0 0 1 2 5 4 0 1 2 4 0 0 1 2 5 0 5 8 4 0)je veux enlever les deux zéros du milieu, pour ce résultat : (0 0 0 1 2 5 4 0 1 2 4 1 2 5 0 5 8 4 0)Ici la fonction interne n'est plus utilePS : J'espère que l'on parle de la même... vl-remove L'intérêt ici est de supprimer un nombre fixe d'éléments de liste. Je reprends mon exemple, en le modifiant un peu :(1 2 3 4 5 6 7 8 9 10 11 12 23 7 8 9 15 8)La routine retourne la même liste sans le 7 8 9 du milieu.(1 2 3 4 5 6 10 11 12 23 7 8 9 15 8)par contre elle ne supprime les autres 7, 8 ou 9 de la liste. Voilà. Si ca peut t'aider à voir la différence entre les deux et à éclaircir le but de cette fonction... [Edité le 4/12/2007 par Matt666] "Chacun compte pour un, et nul ne compte pour plus d'un."
lovecraft Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 Ah afin je peux me reconnecter sur cadxp (des petits soucis de server de proxy).Merci de penser à nous Matt. Je vais voir ce que je peux faire de ton challenge, j'aurais certainement quelques questions.... @plus http://www.youtube.com/user/CADMINATOR?feature=mhee
(gile) Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 Salut, l'énnoncé n'est pas très clair, s'agit-il de supprimer des éléments aux index spécifiés, sinon comment savoir à quelle occurence de l'élément il est fait référence ? Par exemple, avec la liste '(0 0 0 1 2 5 4 0 1 2 4 0 0 1 2 5 0 5 8 4 0), faut-il faire :(suppr '(11 12) '(0 0 0 1 2 5 4 0 1 2 4 0 0 1 2 5 0 5 8 4 0)) -> '(0 0 0 1 2 5 4 0 1 2 4 1 2 5 0 5 8 4 0)sinon, comment savoir quels 0 il faut supprimer ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 l'énnoncé n'est pas très clair, s'agit-il de supprimer des éléments aux index spécifiés, sinon comment savoir à quelle occurence de l'élément il est fait référence ?C'est ce que je pense aussi...mais pour moi il y a eu un petit "rattrapage de branches" entre le premier et le complément de l'ennoncé suivant, ce qui rends le truc étrange.... ;) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Matt666 Posté(e) le 4 décembre 2007 Auteur Posté(e) le 4 décembre 2007 Raaah là là... Va falloir que je revois ma capacité à établir un énoncé clair... :( En fait je pensais que tout ça était à trouver, justement... Comment faire pour supprimer de la liste un nombre d'éléments donné en partant d'une position dans la liste...Bon...J'ai fait une routine comme suit :(delst lst pos nb) Avec :lst -> La liste à modifierpos -> La position de dépoartnb -> le nombre d'éléments à supprimer.J'ai trouvé qu'il était intéressant d'en faire un challenge, c'est tout ! Mais je voulais pas en dire trop... Faut croire que j'aurais du !! petit "rattrapage de branches"Nan, promis ! ;) comment savoir quels 0 il faut supprimerAvec la position de départ... Voilà, désolé pour tout ça...PS : Il commence bien ce challenge !!! :mad2: [Edité le 4/12/2007 par Matt666] "Chacun compte pour un, et nul ne compte pour plus d'un."
ElpanovEvgeniy Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 (defun test (l p) (if (and l p) (if (> (car p) 1) (cons (car l) (test (cdr l) (mapcar '1- p))) (test (cdr l) (mapcar '1- (cdr p))) ) ;_ if l ) ;_ if ) ;_ defun (test '(1 2 3 4 5 6 7 8 9 10 11 12 23) '(7 8 9)) ;=> '(1 2 3 4 5 6 10 11 12 23) (test '(1 2 3 4 5 6 7 8 9 10 11 12 23 7 8 9 15 8) '(7 8 9)) ;=> '(1 2 3 4 5 6 10 11 12 23 7 8 9 15 8) (test '(0 0 0 1 2 5 4 0 1 2 4 0 0 1 2 5 0 5 8 4 0) '(11 12)) ;=> '(0 0 0 1 2 5 4 0 1 2 0 1 2 5 0 5 8 4 0) Evgeniy
(gile) Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 Donc il s'agit de supprimer, dans une liste (argument 1), à partir de l'indice spécifié (argument 2), le nombre d'éléments successifs (argument 3). Exemple : (setq lst '(1 2 3 4 5 6 7 8 9)) (delst lst 1 2) -> (1 4 5 6 7 8 9) ; supprimé 2 éléments à partir de l'indice 1 (2ème élément) (delst lst 0 3) -> (4 5 6 7 8 9) ; supprimé 3 éléments à partir de l'indice 0 (1er élément) (delst lst 3 2) - > (1 2 3 6 7 8 9) ; supprimé 2 éléments à partir de l'indice 3 (4ème élément) (delst lst 3 12) - > (1 2 3) ; supprimé tous les éléments à partir de l'indice 3 (4ème élément) (delst lst 3 0) -> (1 2 3 4 5 6 7 8 9) ; supprimé aucun élément J'avais déjà une routine pour supprimer les éléments de l'indice n à l'indice m, donc pratiquement rien à changer pour l'adapter ua challenge.Je laisse jouer les autres avant de poster. Please Evgeniy, let some newbies try to answer before posting a reply, it's too easy for you ! Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Matt666 Posté(e) le 4 décembre 2007 Auteur Posté(e) le 4 décembre 2007 Exactement Gile ! "Chacun compte pour un, et nul ne compte pour plus d'un."
ElpanovEvgeniy Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 Please Evgeniy, let some newbies try to answer before posting a reply, it's too easy for you ! S'il vous plaît!On regrette qu'il y a longtemps il n'y a pas de compétitions complexes... Evgeniy
Bred Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 Re,c'est d'un frustrant ces challenges ! :o On attends combien de temps ?(ElpanovEvgeniy à fais péter la récurcive en plus... elle est récursive la tienne, (gile) ?moi j'en ai une avec un repeat...) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
ElpanovEvgeniy Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 Re,c'est d'un frustrant ces challenges ! :o On attends combien de temps ?(ElpanovEvgeniy à fais péter la récurcive en plus... elle est récursive la tienne, (gile) ?moi j'en ai une avec un repeat...) Dans tels sujets, je fais toujours un nouveau programme!Autrement, ce n'est pas intéressant... Evgeniy
(gile) Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 Bred, Oui ma routine est récursive, elle ressemble à remove_ind (ici) et à celle d'Evgeniy (qui, par ailleurs, ne répond pas précisément à l'énnoncé tel que je le donnais réponse 8 mais à ce que je pensais avoir compris réponse 4). Evegeniy, There's a new challenge here, ann you can see this thread [Edité le 5/12/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lili2006 Posté(e) le 4 décembre 2007 Posté(e) le 4 décembre 2007 Bonsoir à toutes et tous, Matt666, merci de ta pensée, mais entre le manque de temps pour s'y pencher vraiment et la marche que j'ai "peur" de franchir, je crains de ne pouvoir rien sortir,...Mais, je suis ce challenge de prés et avec le même intérêt que les autres,....Je me contente encore d'essayer d'assimiler tout ce que je vois, mais je reste convaincu qu'il faut (comme me dis (gile)) commencer par le bon bout et je compte sur vous pour savoir ou il est ??!!! Désolé de ne pas encore être apte à te suivre . Vivement du temps car ces challenges sont trés utiles pour la recherche et la compréhension. N'y connaissant pas grand chose, je pense cependant qu'il faut te laisser libre dans la pédagogie et la vision que tu as de ce que tu recherches à faire faire (ouh là, même moi j'comprend pas c'que j'veux dire !!??) Enfin si, quand même. Raaah là là... Va falloir que je revois ma capacité à établir un énoncé clair... NON, c'est ta vision ! En fait je pensais que tout ça était à trouver, justement... Justement, c'est ce que tu cherches, et les questions vont arriver dans ce sens. Promis, j'essaye quelque chose mais attendez-vous au pire,... Bonne nuit. Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
Matt666 Posté(e) le 5 décembre 2007 Auteur Posté(e) le 5 décembre 2007 la marche que j'ai "peur" de franchir, je crains de ne pouvoir rien sortir,Ces exercices sont justement faits pour ça ! NON, c'est ta vision !Ah bah merci !!! :) Promis, j'essaye quelque chose mais attendez-vous au pire,...Cool ! C'est bien de se lancer ! mais je reste convaincu qu'il faut (comme me dis (gile)) commencer par le bon bout et je compte sur vous pour savoir ou il est ??!!!Oui, il a raison... PISTE : Déjà, le sujet porte sur une liste. --->En autolisp, tu n'as que quelques fonctions utilisant des listes. (car cdr assoc member last length list cons append listp reverse foreach acad_strlsort nth).--->En Vlisp, c'est pareil (vl-every vl-list vl-list->string vl-list-length vl-member-if vl-member-if-not vl-position vl-remove vl-remove-if vl-remove-if-not vl-some vl-sort vl-sort-i). Sauf qu'ici tu n'as pas besoin de vlisp.Si tu regardes la fonction (delst lst pos nb) tu as :delst -> Le nom de la fonctionlst -> La liste à modifierpos -> La position de dépoartnb -> Le nombre d'éléments à supprimer. Dans l'exemple de gile, (setq liste '(1 2 3 4 5 6 7 8 9))Si tu veux supprimer le 4, le 5 et le 6 de la liste. tu fais donc appel à la fonction(delstensuite la position de départ (le premier élt d'une liste, c'est zéro), donc 3(delst 3et enfin le nb d'éléments à supprimer, donc 3(delst 3 3) ==> (1 2 3 7 8 9) Voilà. Bon courage !!Matt. "Chacun compte pour un, et nul ne compte pour plus d'un."
lovecraft Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 Bonjour, Voici le debut de mes idées. (defun c:test () (setq lst '(1 2 3 4 5 6 7 8 9 10));liste (setq nbrelts (length lst));nombres d'éléments dans la liste (setq p_dep (- (getint "\nDonnez la position de départ : ") 1));position de départ (setq nbr_supp (getint "\nDonner le nombres d'éléments à supprimer: "));nombres d'éléments à supprimer (repeat nbr_supp (vl-remove (nth p_dep lst) lst) );fin du repeat (setq p_dep (+ 1 p_dep)) ) bon il ne fonctionne pas encore, mais pouvez vous me dire si je suis sur la bonne piste? merci http://www.youtube.com/user/CADMINATOR?feature=mhee
Matt666 Posté(e) le 5 décembre 2007 Auteur Posté(e) le 5 décembre 2007 Salut lovecraft !Bah c'est pas mal du tout !! (setq lst '(1 2 3 4 5 6 7 8 9 10)) (setq nbrelts (length lst)) (setq p_dep (- (getint "\nDonnez la position de départ : ") 1)) (setq nbr_supp (getint "\nDonner le nombres d'éléments à supprimer: "))Là tu donnes les bases du problème. Et c'est bon.Ensuite, ça se complique :(repeat nbr_supp)Une fonction repeat. Ok, tu peux le faire comme ça, et c'est même le plus simple à faire... (vl-remove (nth p_dep lst) lst)C'est ici ton premier porblème. si on décortique un peu, tu utilises la fonction nth.nth retourne la position d'un élément dans une liste. Dans ton code, tu ne demandes la position d'un élément. Tu demandes la position d'une position ! (p_dep) Voilà. Si tu veux continuer dans ce sens, il faut d'abord que tu trouves quel élément se trouve à la position "p-dep". Autre problème : vl-remove demande un élément de la liste à supprimer. Et pas une position. Ensuite tu dis ceci : (setq p_dep (+ 1 p_dep))le seul problème, c'est que ce bout de code se trouve en dehors de la fonction de répétition (repeat)... Pour que ça fonctionne, il faut que ton compteur se trouve au sein de la répétition... Sinon, et pour finir, vl-remove supprime tous les éléments donnés d'une liste. Si tu as une liste comme ceci (0 1 2 3 0 0 1 2 4 0 0 1 2 0 0 1), et que tu demandes à vl-remove de supprimer le 0 de la liste, il supprimera tous les 0... Comme ça : (1 2 3 1 2 4 1 2 1)... Ici la fonction sert à supprimer un nombre défini d'une liste... vl-remove est trop "puissant" pour cette fonction... Voilà !Bon courage à toi ! "Chacun compte pour un, et nul ne compte pour plus d'un."
lili2006 Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 Re, 3h00 de recherche et rien ! Bravo lovecraft pour ta proposition et Matt666 pour les réponses.Je continu de chercher et suivre l'évolution de ce post,... @+, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
lovecraft Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 hem, j'ai une p'tite question il n'y a pas l'équivalent de la fonction substr pour les nombres ? @plus http://www.youtube.com/user/CADMINATOR?feature=mhee
Matt666 Posté(e) le 5 décembre 2007 Auteur Posté(e) le 5 décembre 2007 Attention substr ne fonctionne que pour les chaînes de caractère... Pas pour les listes...Ceci dit, ce que tu demandes est exactement la réponse de ce challenge, mais à l'envers !! Un équivalent à la fonction substr pour les listes... Donc pour ta gouverne, nan !! :) 3h00 de recherche et rienCourage lili !! Petite piste :Au lieu de chercher à supprimer, pourquoi ne pas recréer une liste sans les éléments que l'on souhaite enlever ? ;) [Edité le 5/12/2007 par Matt666] [Edité le 6/12/2007 par Matt666] "Chacun compte pour un, et nul ne compte pour plus d'un."
(gile) Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 hem, j'ai une p'tite question il n'y a pas l'équivalent de la fonction substr pour les nombres ? Un petit coup de pouce , fais une recherche dans les forums avec sublist Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lovecraft Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 bon voila je sais que ce n'est pas parfait : mais cela fonctionne Merci de vos commentaires (defun c:test () (setq lst '(1 2 3 3 3 4 5 6 2 7 8 9 3 3 0 0 10));liste (setq nbrelts (length lst));nombres d'éléments dans la liste (setq p_dep (- (getint "\nDonnez la position de départ : ") 1));position de départ (setq nbr_supp (getint "\nDonner le nombres d'éléments à supprimer: "));nombres d'éléments à supprimer (setq i (+ p_dep nbr_supp)) (setq lst2 nil) (repeat (- nbrelts (+ p_dep nbr_supp)) (setq lst2 (cons (nth i lst) lst2)) (setq i (+ i 1)) ) (setq lst1 nil) (setq i 0) (repeat p_dep (setq lst1 (cons (nth i lst) lst1)) (setq i (+ i 1)) ) (setq lst_FINAL (append (reverse lst1) (reverse lst2))) (prin1 lst_final) ) Ok Gile, je vais regarder ça @plus http://www.youtube.com/user/CADMINATOR?feature=mhee
(gile) Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 Super ! Quelques petites remarques : - pour la forme, comme ce type de routine peut être utilie, je pense qu'il est préférable de faire une sous routine avec 3 arguments qui retourne la liste transformée. Elle pourrait ainsi être appelée par différents LISP : (defun delist (lst dep nb / nbrelts ...) ...) et, si tu veux, une fonction d'appel qui utilise la sous routine : (defun c:test (/ lst p_dep nbr_supp result) (setq lst '(1 2 3 3 3 4 5 6 2 7 8 9 3 3 0 0 10));liste (setq p_dep (- (getint "\nDonnez la position de départ : ") 1));position de départ (setq nbr_supp (getint "\nDonner le nombres d'éléments à supprimer: "));nombres d'éléments à supprimer (setq result (delst lst p_dep nbrelts) ; appel de la sous routine (prin1 lst_final) (princ) ; pour éviter le deuxième retour sur la ligne de commande - sinon, plus important à mon avis, déclare les variables, ça t'évitera les (setq lst1 nil) et surtout de mauvaises surprises. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 Salut lovecraft ,regarde aussi la fonction "member". Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
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