(gile) Posté(e) le 12 novembre 2009 Posté(e) le 12 novembre 2009 Salut, Encore un petit challenge de manipulation de listes.Il s'agit, dans une liste de faire monter d'un rang les éléments spécifiés dans une liste d'indices triés. Exemples :(setq lst '("a" "b" "c" "d" "e" "f")) (list_up '(2 3) lst) retourne ("a" "c" "d" "b" "e" "f")(list_up '(0 3) lst) retourne ("a" "b" "d" "c" "e" "f")(list_up '(0 1 4 5) lst) retourne ("a" "b" "c" "e" "f" "d") ou avec une liste de chiffres(setq lst '(0 1 2 3 4 5)) (list_up '(1 3) lst) retourne (1 0 3 2 4 5)(list_up '(0 2) lst) retourne (0 2 1 3 4 5)(list_up '(3 4 5) lst) retourne (0 1 3 4 5 2) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 13 novembre 2009 Posté(e) le 13 novembre 2009 Salut (gile) La liste n'a pas de doublons ? @+ 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 13 novembre 2009 Auteur Posté(e) le 13 novembre 2009 Salut, Peu importe, puisque c'est les éléments aux index spécifiés qui doivent monter d'un cran.Par contre, la liste d'index ne doit pas en contenir et être triée en ordre croissant. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 13 novembre 2009 Posté(e) le 13 novembre 2009 Mince, j'ai les parents à la maison ce WE. Moi qui pensais me détendre !Je finis ma journé dans quelques minutes et rentre à la maison sans avoir le loisir d'allumer l'ordi je pense. Eugène va certainement nous débloquer ça. Mais, au juste, je ne comprends pastout ; c'est le nth n qui "va plus loin d'1 cran" ?Si je prends (list_up '(2 3) lst) retourne ("a" "c" "d" "b" "e" "f"), il me semble que le nth 2 et le nth 3 sont descendus ! Je parle de NTH car je crois que tout le monde comprend. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 13 novembre 2009 Posté(e) le 13 novembre 2009 Salut pour commencer Celle qui n'accepte pas de doublon (defun list_up1(up lst / ele ind inv) (while (setq ind (car up)) (and (> ind 0) (setq ele (nth ind lst) inv (reverse lst) lst (append (reverse (cddr (member ele inv))) (list ele) (list (cadr (member ele inv))) (cdr (member ele lst)) ) ) ) (setq up (cdr up)) ) lst ) pour le plaisir d'un mapcar (defun list_up2(up lst / i j) (while (setq i (car up)) (or (= i 0) (setq lst (mapcar '(lambda(a b) (cond ((eq (nth i lst) b) (setq j a) b ) (j (setq b j j nil) b ) (T a ) ) ) (cons "" lst) (append lst '("")) ) lst (cdr lst) ) ) (setq up (cdr up)) ) lst ) La plus rapide (defun list_up3(up lst / i j k s) (setq i 0) (while (setq j (nth i lst)) (if (member (1+ i) up) (progn (or s (setq s j)) (setq j (nth (1+ i) lst)) ) (and s (setq j s s nil ) ) ) (setq k (cons j k)) (setq i (1+ i)) ) (reverse k) ) Tramber : il reste une récursive à faire ;) @+ ps : (list_up '(0 1 4 5) lst) retourne ("b" "a" "c" "e" "f" "d") Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 13 novembre 2009 Posté(e) le 13 novembre 2009 Bonjour, (list_up '(0 1 4 5) lst) retourne ("a" "b" "c" "e" "f" "d") pourquoi le "b" ne remonte pas dans ce cas ? Une erreur dans l'énoncé, le ps de Patrick_35 semble le confirmer. (defun ulist_up (nb lst / NL I) (if (and (/= NB 0) (< NB (length lst))) (progn (setq I 0) (repeat (length lst) (cond ((= I (- NB 1)) (setq NL (cons (nth NB lst) NL)) ) ((= I NB) (setq NL (cons (nth (- NB 1) lst) NL)) ) (T (setq NL (cons (nth I lst) NL))) ) (setq I (+ I 1)) ) (setq NL (reverse NL)) ) (setq NL lst) ) NL ) (defun list_up (lsi lst / I IDX) (setq I 0) (repeat (length lsi) (setq IDX (nth I lsi)) (setq lst (ulist_up IDX lst)) (setq I (+ I 1)) ) lst ) (defun c:poplist () ;;(setq lst '("a" "b" "c" "d" "e" "f")) (setq lst '(0 1 2 3 4 5)) (setq lsi '(3 4 5)) (list_up lsi lst) ) AmicalementVincent [Edité le 13/11/2009 par zebulon_] 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 13 novembre 2009 Auteur Posté(e) le 13 novembre 2009 Tramber, Tu chipotes sur les mots, si le NTH de l'élément décroit effectivement de 1 (sauf s'il est coincé en tête de liste), on peut aussi dire que l'élément "remonte vers le début de la liste.Je pense qu'avec les exemples tout le monde a compris dans quel sens ça se passe. Patrick_35, Tramber : il reste une récursive à faire ;) J'en ai une en magasin... zebulon et Patrick_35, (list_up '(0 1 4 5) lst) retourne ("a" "b" "c" "e" "f" "d")pourquoi le "b" ne remonte pas dans ce cas ? Une erreur dans l'énoncé, le ps de Patrick_35 semble le confirmer. Et non, pas d'erreur dans l'énoncé. Le "b" ne remonte pas (ou ne descend pour Tramber pas) parce que la liste d'index contient aussi le 0 qui lui aussi devrait remonter mais est "coincé").C'est (list_up '(1 4 5) lst) qui retourne ("b" "a" "c" "e" "f" "d") (list_up '(0 1 2) lst) doit retourner ("a" "b" "c" "d" "e" "f") Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 13 novembre 2009 Posté(e) le 13 novembre 2009 Ok. Je n'avais bloqué que l'index 0. Il faut aussi bloquer l'index 1, lorsqu'il y a un index 0. L'index 2, lorsqu'il y a un index 1 et un index 0 etc...Dans l'exemple qui nous préoccupe : '(0 1 4 5) 0 et 1 sont bloqués. Or 0 et 1 sont les seuls à être à la bonne position dans la liste. 4 est à la deuxième place et 5 à la troisième. Donc un test avec vl-position devrait pouvoir résoudre le problème. (defun ulist_up (nb lst lsi / NL I) (if (and (/= (vl-position nb lsi) nb) (< NB (length lst))) (progn (setq I 0) (repeat (length lst) (cond ((= I (- NB 1)) (setq NL (cons (nth NB lst) NL)) ) ((= I NB) (setq NL (cons (nth (- NB 1) lst) NL)) ) (T (setq NL (cons (nth I lst) NL))) ) (setq I (+ I 1)) ) (setq NL (reverse NL)) ) (setq NL lst) ) NL ) (defun list_up (lsi lst / I IDX) (setq I 0) (repeat (length lsi) (setq IDX (nth I lsi)) (setq lst (ulist_up IDX lst lsi)) (setq I (+ I 1)) ) lst ) (defun c:poplist () (vl-load-com) (setq lst '("a" "b" "c" "d" "e" "f")) ;;(setq lst '(0 1 2 3 4 5)) (setq lsi '(0 1 4 5)) (list_up lsi lst) ) 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 13 novembre 2009 Auteur Posté(e) le 13 novembre 2009 Super :D Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ElpanovEvgeniy Posté(e) le 14 novembre 2009 Posté(e) le 14 novembre 2009 Eugène va certainement nous débloquer ça. Salut! Je montrerai absolument la variante.Les jours fériés, je regarde seulement vos variantes. Je montrerai seulement recursion la variante... Evgeniy
ElpanovEvgeniy Posté(e) le 16 novembre 2009 Posté(e) le 16 novembre 2009 recursion variant: (defun F (i l) (cond ((or (null i) (null (cdr l))) l) ((= 1 (car i)) (cons (cadr l) (f (mapcar '1- (cdr i)) (cons (car l) (cddr l))))) ((< (car i) 1) (cons (car l) (f (mapcar '1- (cdr i)) (cdr l)))) ((cons (car l) (f (mapcar '1- i) (cdr l)))) ) ) Evgeniy
ElpanovEvgeniy Posté(e) le 16 novembre 2009 Posté(e) le 16 novembre 2009 Patrick_35, contrôle le programme : (setq lst '("a" "a" "a" "b" "b" "b")) (list_up1 '(2 3) lst) ;=>> ("a" "a" "a" "a" "a" "a" "a" "a" "a" "b" "b" "b") (list_up1 '(0 3) lst) ;=>> ("a" "a" "a" "b" "b" "b" "b" "b") (list_up1 '(0 1 4 5) lst);=>> ("a" "a" "a" "a" "a" "a" "a" "a" "a" "a" "a" "a" "a" "a" "a" "a" "a" "b" "b" "b") Evgeniy
Tramber Posté(e) le 16 novembre 2009 Posté(e) le 16 novembre 2009 Les russes vont envahir la France :cool: Vous voyez ce qui se passe quand vous ne me laissez pas le temps de participer :D Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 16 novembre 2009 Auteur Posté(e) le 16 novembre 2009 Salut, Ma réponse est la même que celle d'Evgeniy.(defun list_up (ind lst) (cond ((or (null ind) (null lst)) lst) ((= 0 (car ind)) (cons (car lst) (list_up (cdr (mapcar '1- ind)) (cdr lst))) ) ((= 1 (car ind)) (cons (cadr lst) (list_up (cdr (mapcar '1- ind)) (cons (car lst) (cddr lst))) ) ) (T (cons (car lst) (list_up (mapcar '1- ind) (cdr lst)))) ) )Je l'avais donnée ici.C'est là que j'ai piqué cette idée de challenge. Eh Tramber, tu as eu tout le week-end !... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ElpanovEvgeniy Posté(e) le 16 novembre 2009 Posté(e) le 16 novembre 2009 Salut, Ma réponse est la même que celle d'Evgeniy.... Maintenant, je réduis quelques mots : (defun F (i l) (cond ((or (null i) (null (cdr l))) l) ((= 1 (car i)) (cons (cadr l) (f (mapcar '1- (cdr i)) (cons (car l) (cddr l))))) ((cons (car l) (f (mapcar '1- (if (< (car i) 1)(cdr i) i)) (cdr l)))) ) ;_ cond ):) Evgeniy
Tramber Posté(e) le 16 novembre 2009 Posté(e) le 16 novembre 2009 Ohhhh, facile..... J'avais les parents : restos, bateau mouche (promène couillons à Marseille, ballade touristique à Strasbourg), cuisine, théâtre. Je n'ai pas eu une minute d'ordinateur ! Ceci dit elle a l'air chouette vot' routine ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
ElpanovEvgeniy Posté(e) le 16 novembre 2009 Posté(e) le 16 novembre 2009 Salut Tramber. Je fais les excuses!Effectivement, il m'était nécessaire d'être plus retenu et attendre jusqu'à lundi suivant... Evgeniy
zebulon_ Posté(e) le 16 novembre 2009 Posté(e) le 16 novembre 2009 Ceci dit elle a l'air chouette vot' routine ! et cela renforce mon humilité quand je constate qu'il est possible de résoudre ce problème en 4 lignes, alors qu'il m'en a fallu 30. Allez, pour me consoler, on va dire qu'il n'y a que le résultat qui compte ;) 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)
Tramber Posté(e) le 16 novembre 2009 Posté(e) le 16 novembre 2009 Je fais les excuses!Effectivement, il m'était nécessaire d'être plus retenu et attendre jusqu'à lundi suivant... Bon, je t'excuse. Spaciba :o Tu peux aussi proposer des challenges. Vincent, t'inquiètes pas, il m'en aurait aussi fallu 15,.... parce que je compresse davantage mon code ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
ElpanovEvgeniy Posté(e) le 17 novembre 2009 Posté(e) le 17 novembre 2009 Aujourd'hui, a remarqué le contrôle superflu dans la première ligne.. (defun F (i l) (cond ((null (and i (cdr l))) l) ((= 1 (car i)) (cons (cadr l) (f (mapcar '1- (cdr i)) (cons (car l) (cddr l))))) ((cons (car l) (f (mapcar '1- (if (< (car i) 1) (cdr i) i)) (cdr l)))) ) ) Evgeniy
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