Aller au contenu

Messages recommandés

Posté(e)

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."

Posté(e)

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...

Posté(e)

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 utile

PS : 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."

Posté(e)

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

Posté(e)
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...

Posté(e)

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 à modifier

pos -> La position de dépoart

nb -> 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 supprimer

Avec 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."

Posté(e)
(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

Posté(e)

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

Posté(e)

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

Posté(e)

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...

Posté(e)
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

Posté(e)

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

Posté(e)

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/

Posté(e)
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 fonction

lst -> La liste à modifier

pos -> La position de dépoart

nb -> 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

(delst

ensuite la position de départ (le premier élt d'une liste, c'est zéro), donc 3

(delst 3

et 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."

Posté(e)

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

Posté(e)

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."

Posté(e)

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 rien

Courage 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."

Posté(e)
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

Posté(e)

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

 

 

 

Posté(e)

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

Posté(e)

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...

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é