Aller au contenu

Messages recommandés

Posté(e)

Bonjour

Je reprends une idée que je trouve sympa sur un site Anglais

C'est de trouver une astuce de programmation pour résoudre un problème et qui nous aidera dans nos futurs lisps

Donc je commence le premier en esperant que d'autres suivront ;)

 

J'ai une liste qui se compose de cette manière

(setq lst '(("a" "c") ("b" "b") ("b" "a") ("a" "a") ("d" "c") ("d" "e") ("c" "c") ("b" "e") ("b" "e")))

 

Je souhaite tout simplement la mettre dans l'ordre

(("a" "a") ("a" "c") ("b" "a") ("b" "b") ("b" "e") ("b" "e") ("c" "c") ("d" "c") ("d" "e"))

 

@+

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)

Super initiaive,

 

J'aime beaucoup ces "challenges" sur TheSwamp.

 

Je donne une première réponse, j'en ai une autre, peut-être moins élégante, mais qui semble plus rapide.

 

Je laisse un peu de temps à d'autres pour chercher...

 

(vl-sort lst
 '(lambda (s1 s2)
    (	  )
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

(gile)....

arrête de me faire du mal !!!...

 

http://gifs.toutimages.com/images/personnages/person_028.gif

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Comme on disait avant dans le jeu des chiffres et des lettres :

"Pas mieux"

 

bonne idée, ce challenge ; mon problème c'est que je me connecte tard et que les bonnes idées auront déjà été émises.

Posté(e)

eh eh, malin le (gile).

 

bonnes idées auront déjà été émises.

Par forcement, je pense que l'on peut faire plus rapide et une routine qui fonctionne aussi avec des nombres

 

Maintenant un peu plus compliqué

 

(setq lst '((1 "a" "c") (2 "b" "b") (5 "b" "a") (1 "a" "a") (4 "d" "c") (2 "d" "e") (10 "c" "c") (12 "b" "e") (2 "b" "e")))

Je souhaite trier ma liste à partir du 2em élement

 

((1 "a" "a") (1 "a" "c") (5 "b" "a") (2 "b" "b") (12 "b" "e") (2 "b" "e") (10 "c" "c") (4 "d" "c") (2 "d" "e"))

 

ps : (gile) n'appuie pas trop vite sur le "buzzer" ;)

 

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)

Pas beau...

et le plus difficile étant été déjà fait par (gile) ...

 

(defun test (lst / LST-F LST1 X)
(setq lst1 (vl-sort (mapcar 'cdr lst) '(lambda (s1 s2)
		      (< (apply 'strcat s1) (apply 'strcat s2))))
     lst-F nil
     x 0)
(repeat (length lst)
 (foreach n lst
   (if (equal (cdr n) (nth x lst1))
     (setq lst-F (append lst-F (list n)))
     )
   )
 (setq x (+ x 1))
 )
 lst-F
 )

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

ps : (gile) n'appuie pas trop vite sur le "buzzer"

J'ai laissé Bred répondre ;)

 

Une qui fonctionne avec des listes de longueur inégales, et aussi bien avec des chiffres ou des lettres" (les éléments de même rang doivent être de même nature).

 

(setq lst '((1 "a" "c")

(2 "b" "b")

(5 "b" "a")

(1 "a" "a" "a")

(4 "d" "c")

(2 "d" "e")

(10 "c" "c")

(12 "b" "e" "a")

(2 "b" "e" "c")

(5 "a" "a" "b")

)

)

 

;;Arguments
;; lst : la liste à trier
;; pos : la position de l'élément à partir duquel commence le tri (premier élément = 0)

(defun test (lst pos / n)
 (setq n (apply 'max (mapcar 'length lst)))
 (repeat (- n pos)
   (setq n    (1- n)
  lst (vl-sort
	lst
	'(lambda (e1 e2) (	      )
   )
 )
)

 

(test lst 1) -> ((1 "a" "a" "a") (5 "a" "a" "b") (1 "a" "c") (5 "b" "a") (2 "b" "b") (12 "b" "e" "a") (2 "b" "e" "c") (10 "c" "c") (4 "d" "c") (2 "d" "e"))

 

(test lst 0) -> ((1 "a" "a" "a") (1 "a" "c") (2 "b" "b") (2 "b" "e" "c") (2 "d" "e") (4 "d" "c") (5 "a" "a" "b") (5 "b" "a") (10 "c" "c") (12 "b" "e" "a"))

 

[Edité le 17/5/2007 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour :)

 

(defun check (a b i)
(cond ((not (and a b)) nil)
      ((> i 0) (check (cdr a) (cdr b) (1- i)))
      ((< (car a) (car b)))
      ((= (car a) (car b)) (check (cdr a) (cdr b) 0))
) ;_  cond
) ;_  defun
(defun test (lst pos) (vl-sort lst '(lambda (a b) (check a b pos)))) 

Evgeniy

Posté(e)

Ouch...

Je pense que je vais faire plus simple

 

(vl-sort lst '(lambda (a b) (if (= (cadr a) (cadr b))
				     (< (caddr a) (caddr b))
				     (< (cadr a) (cadr b))
				   )
		     )
       )

 

@+

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

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é