Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

 

Amicalement

Vincent

 

[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)

Posté(e)

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

Posté(e)

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

 

Amicalement

Vincent

 

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)

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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

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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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 ;)

 

Amicalement

Vincent

 

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)

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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

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é