Aller au contenu

Messages recommandés

Posté(e)

Bonjour

 

Je viens d'avoir une idée de challenge

 

Le but serait dans une liste de conserver que les chiffres.

 

Exemple

(1 2 "a" "b" (6.5 7 "z" "r") "f" (3 "q" (3 "r" 0) "d" 8.4) "g" 8 ("dd" ("jj" "nn") "tt") 9 ("zz" ("ww" "ze" (20 25)) "tt"))) donnerai (1 2 (6.5 7) (3 (3 0) 8.4) 8 9 (((20 25))))

 

Une autre de ramener tous les chiffres sur un seul niveau d'une liste

 

Exemple

(1 2 "a" "b" (6.5 7 "z" "r") "f" (3 "q" (3 "r" 0) "d" 8.4) "g" 8 ("dd" ("jj" "nn") "tt") 9 ("zz" ("ww" "ze" (20 25)) "tt"))) donnerai (1 2 6.5 7 3 3 0 8.4 8 9 20 25)

 

A vos neurones ;)

 

@+

 

ps : je pense que c'est un peu trop facile pour (gile) ;)

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)

Yahaaaa!

 

Un petit challenge :D .

 

La première version est déjà faite, reste encore la liste sans sous-liste pour le resultat

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

ps : je pense que c'est un peu trop facile pour (gile)

 

Bon si on écarte (gile), je fais une proposition... ;)

 

Et puis comme personne ne se bouscule au portillon pour les challenges.

 

(defun foo (el / lst)
(foreach n el
 (cond
   ((eq (type n) 'LIST)
     (setq lst (cons (foo n) lst))
   )
   ((numberp n)
     (setq lst (cons n lst))
   )
 )
)
(if lst (reverse lst) (prin1))
)

 

en deuxième

(defun foo (el / lst)
(foreach n el
 (cond
   ((eq (type n) 'LIST)
     (if (listp (foo n))
       (setq lst (append (foo n) lst))
       (setq lst (cons (foo n) lst))
     )
   )
   ((numberp n)
     (setq lst (cons n lst))
   )
 )
)
(if lst (reverse lst) (prin1))
)

 

Comme ça (gile) pourra proposer mieux et sous différentes formes.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Bon, je n'ai pas eu le temps de faire la deuxième version.

 

mais voici la première:

;-------------------------------------;
; nom: keep_number_bseb67             ;
; role: garde uniquement les nombres  ;
;       contenus dans la liste lst    ;
; param: lst => liste d'éléments      ;
; retour: une liste (avec sous listes);
;         nil si pas de nombre        ;
; date: 04/03/2009                    ;
; BLAES Sébastien                     ;
;-------------------------------------;
(defun keep_number_bseb67( lst / res)
 	(cond
  	; on teste si lst est en fait un nombre
  	((/= (member (type lst) (list 'INT 'REAL)) nil)
	 	lst
	)
	; si c'est une liste
	((= (type lst) 'LIST)
	 	; on retire nil du resultat sur le premier élément auquel on ajoute
	 	; le résultat sur la suite de la liste
	 	(vl-remove nil (cons (keep_number_bseb67 (car lst))
		      (keep_number_bseb67 (cdr lst))))
	)
) ; cond
) ; keep_number_bseb67

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Bravo à vous deux :D

 

J'attends la réponse de (gile) pour proposer mes deux versions.

 

Bonus

Pour la première version, tu as (1 2 (6.5 7) (3 (3 0) 8.4) 8 () 9 (((20 25)))) au lieu de (1 2 (6.5 7) (3 (3 0) 8.4) 8 9 (((20 25))))

Entre le 8 et 9, tu as une liste vide.

Pour la seconde, les chiffres ne sont pas toujours dans le bon ordre.

 

@+

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)

Salut,

 

Je croyais que j'avais pas droit :exclam:

 

Deux petits trucs vite faits :

 

(defun test1 (l / s)
 (if l
   (if	(listp (car l))
     (if (setq s (test1 (car l)))
(cons s (test1 (cdr l)))
(test1 (cdr l))
     )
     (if (numberp (car l))
(cons (car l) (test1 (cdr l)))
(test1 (cdr l))
     )
   )
 )
)

 

(defun test2 (l)
 (if l
   (if	(listp (car l))
     (apply 'append (list (test2 (car l)) (test2 (cdr l))))
     (if (numberp (car l))
(cons (car l) (test2 (cdr l)))
(test2 (cdr l))
     )
   )
 )
)

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

Posté(e)

Salut

 

Je croyais que j'avais pas droit :exclam:

Quelle idée :o

 

 

Ma contribution

 

(setq lst '(1 2 "a" "b" (6.5 7 "z" "r") "f" (3 "q" (3 "r" 0) "d" 8.4) "g" 8 ("dd" ("jj" "nn") "tt") 9 ("zz" ("ww" "ze" (20 25)) "tt")))

 

(defun ev1(lst / ele tbl)
 (foreach ele lst
   (if (listp ele)
     (and (setq ele (ev1 ele))
(setq tbl (cons ele tbl))
     )
     (and (numberp ele)
(setq tbl (cons ele tbl))
     )
   )
 )
 (reverse tbl)
)

(ev1 lst)

 

(defun ev2(lst / ele)
 (foreach ele lst
   (if (listp ele)
     (ev2 ele)
     (and (numberp ele)
(setq tbl (cons ele tbl))
     )
   )
 )
 (reverse tbl)
)

(setq tbl nil)
(ev2 lst)

 

@+

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

 

Je croyais que j'avais pas droit :exclam:

Quelle idée :o

 

C'était pour rire ;)

 

J'ai essayer d'un peu optimiser :

 

(defun test1 (l / a b)
 (if (setq a (car l))
   (if	(listp a)
     (if (setq b (test1 a))
(cons b (test1 (cdr l)))
(test1 (cdr l))
     )
     (if (numberp a)
(cons a (test1 (cdr l)))
(test1 (cdr l))
     )
   )
 )
)

 

(defun test2 (l / a)
 (if (setq a (car l))
   (if	(listp a)
     (test2 (append a (cdr l)))
     (if (numberp a)
(cons a (test2 (cdr l)))
(test2 (cdr l))
     )
   )
 )
)

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

Posté(e)

L'approche alternative

 

 
(defun test1 (l)
(cond ((listp l) (vl-remove-if 'null (mapcar 'test1 l)))
      ((numberp l) l)
) ;_  cond
)

 

(defun test2 (l)
(vl-remove-if-not
 'numberp
 (read (strcat "(" (vl-string-translate "()" "  " (vl-princ-to-string l)) ")"))
) ;_  vl-remove-if-not
) 

Evgeniy

Posté(e)

Joli code, Evgeniy (comme toujours !).

 

Une autre version de test1

 

(defun test3 (l)
 (vl-remove nil
     (mapcar
       '(lambda	(x)
	  (cond	((numberp x) x)
		((listp x) (test3 x))
	  )
	)
	l
     )
 )
)

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

Posté(e)

Bonjour

 

ElpanovEvgeniy

Malin dans le test2 de traiter la liste comme une chaine de caractères.

Pour le test1 et 2, jolie code. Difficile de faire plus court :D

 

ElpanovEvgeniy & (gile)

 

On pourrait utiliser une cascade de if au lieu d'un cond.

Cela me semble plus rapide

 

(defun test1 (l)
(if (listp l)
  (vl-remove-if 'null (mapcar 'test1 l))
  (if (numberp l) l)
)
)

 

En tout cas, bravo à vous tous. On a plusieurs manières de traiter les listes :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

 

ElpanovEvgeniy

Malin dans le test2 de traiter la liste comme une chaine de caractères.

Pour le test1 et 2, jolie code. Difficile de faire plus court :D

 

Merci!

Je voulais montrer une autre approche de la décision de la tâche.

Par l'autre, en ce qui concerne tous les autres programmes.

J'ai fait cela. :)

 

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é