Patrick_35 Posté(e) le 4 mars 2009 Posté(e) le 4 mars 2009 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bseb67 Posté(e) le 4 mars 2009 Posté(e) le 4 mars 2009 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...
bonuscad Posté(e) le 4 mars 2009 Posté(e) le 4 mars 2009 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
bseb67 Posté(e) le 4 mars 2009 Posté(e) le 4 mars 2009 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...
Patrick_35 Posté(e) le 4 mars 2009 Auteur Posté(e) le 4 mars 2009 Bravo à vous deux :D J'attends la réponse de (gile) pour proposer mes deux versions. BonusPour 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 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 4 mars 2009 Posté(e) le 4 mars 2009 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
Patrick_35 Posté(e) le 4 mars 2009 Auteur Posté(e) le 4 mars 2009 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 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 4 mars 2009 Posté(e) le 4 mars 2009 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
Matt666 Posté(e) le 4 mars 2009 Posté(e) le 4 mars 2009 :mad2: :mad2: :mad2: :( :( :( J'avais pôôô vu... Sniff "Chacun compte pour un, et nul ne compte pour plus d'un."
ElpanovEvgeniy Posté(e) le 5 mars 2009 Posté(e) le 5 mars 2009 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
(gile) Posté(e) le 5 mars 2009 Posté(e) le 5 mars 2009 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
ElpanovEvgeniy Posté(e) le 5 mars 2009 Posté(e) le 5 mars 2009 Salut (gile)Ton code est irréprochable! test2... (defun test4 (l) (apply 'append (mapcar '(lambda (a) (cond ((numberp a) (list a)) ((listp a) (test4 a)) ) ) l ) ) ) Evgeniy
Patrick_35 Posté(e) le 6 mars 2009 Auteur Posté(e) le 6 mars 2009 Bonjour ElpanovEvgeniyMalin 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
ElpanovEvgeniy Posté(e) le 7 mars 2009 Posté(e) le 7 mars 2009 Bonjour ElpanovEvgeniyMalin 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
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