Aller au contenu

Messages recommandés

Posté(e)

Bonjour

 

Une idée de challenge

Déterminer si un nombre est dans une plage

 

(in 45 "44-50,55sfs-66,100,800") --> T

(in 52 "44-50,55sfs-66,100,800") --> nil

(in 50.2 "44-50.5,55sfs-66,100,800") --> T

(in 50.6 "44-50.5,55sfs-66,100,800") --> nil

(in "58" "44-50.5,55sfs-66,100,800") --> T

(in "67.5" "44-50.5,55sfs-66,100,800") --> nil

 

A vos neurones ;)

 

@+

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)

heu, oui

 

Déjà pour comprendre l'énoncé...

Il faut bien commencer par quelque chose ;)

 

Peux-tu être un peu plus explicite, s'il te plait.

Dans l'exemple donné, tu as comme 1er argument le nombre recherché

Pour le 2em je reprends le même principe qu'une sélection d'impression de pages

Tu as donc comme critères :

44-50, ce qui veut dire de 44 à 50, 44 et 50 inclus

un séparateur (virgule, espace, point-virgule ou autres)

55sfs-66, ce qui veut dire de 55 à 66, 55 et 66 inclus en enlevant les fautes de frappes sfs

un séparateur

le nombre 100

etc...

 

En espérant être plus clair

 

@+

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)
55sfs-66, ce qui veut dire de 55 à 66, 55 et 66 inclus en enlevant les fautes de frappes sfs

 

J'avais tout compris sauf ça !

 

Mais le "pattern" obéit toujours aux mêmes règles ou peut être quelconque ?

 

(in 45 "44-50,100,800"), par exemple.

Est possible et demandé ou pas ?

(in 45 "32,12,122,1235,100,800") par exemple encore.

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Bonjour,

 

On ne parle que de nombres entiers ?

Le premier argument peut être soit un entier, soit un texte ?

 

Pour "corriger" les fautes de frappe, je verrais bien la fonction atoi.

(atoi "55sfs") -> 55

Il y a juste le cas où la faute de frappe est très lourde et que le texte ne commence pas par un chiffre. Dans ce cas atoi renvoi 0

(atoi "sfs55") -> 0

(atoi "coucou") ->0

 

Amicalement

Vincent

 

Finalement, non. Atoi ne peut pas convenir puisque dans les exemples il y a des réels, mais je n'avais pas bien regardé.

 

 

 

[Edité le 28/4/2010 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)

j'ai un petit problème de syntaxe.

 

Comment ça se passe quand il y a des nombres négatifs ? Le (-) moins et le (-) tiret vont être difficiles à discerner. Je propose d'utiliser ":" comme dans les plages excel.

 

(in -47 "-50:-44,55sfs:66,100,800")

 

Si tu es d'accord.

 

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)

Tramber

Le "pattern" peut être quelconque

Tes deux exemples sont valable

 

zebulon_

Les nombres peuvent aussi être des réels

Pour les fautes de frappe, si ce n'est pas un chiffre, on l'ignore tout simplement

(in 0 "0,32,12,122,1235,100,800") --> T

(in 0 "sd0df,32,12,122,1235,100,800") --> T

(in 0 "df,32,12,122,1235,100,800") --> nil

 

Je propose d'utiliser ":" comme dans les plages excel.

(in -47 "-50:-44,10:40,55sfs:66,100,800")

C'est juste, je n'y avais pas pensé. OK

 

(in 40 "-50:-44,40:50,55sfs:66,100,800") --> T

(in -40 "-50:-44,40:50,55sfs:66,100,800") --> nil

 

@+

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)

(vl-load-com)

(defun numonly (txt / RES SIGN)
 ;; supprimer tous les caractères autres que des nombres, "." "+" et "-"
 (setq RES 
   (vl-list->string
     (vl-remove-if-not
       '(lambda (x)
         (member x '(43 45 46 48 49 50 51 52 53 54 55 56 57))
       )
       (vl-string->list txt)
     )
   )
 )
 ;; déterminer le signe
 (if (= (substr RES 1 1) "-")
   (setq 
     SIGN "-"
     RES (substr RES 2)
   )
   (setq SIGN "")
 )
 ;; supprimer tous les "+" et "-"
 (setq RES 
   (vl-list->string
     (vl-remove-if
       '(lambda (x)
         (member x '(43 45))
       )
       (vl-string->list RES)
     )
   )
 )  
 (strcat SIGN RES)
)

(defun borne (ELEM / POS BI BS)
 (if (setq POS (vl-string-position 58 ELEM))
   (setq
     BI (distof (numonly (substr ELEM 1 POS)) 2)
     BS (distof (numonly (substr ELEM (+ POS 2))) 2)
   )
   (setq
     BI (distof (numonly ELEM) 2)
     BS (distof (numonly ELEM) 2)
   )
 )
 (if (and BI BS)
   (list BI BS)
 )
)

(defun in (NB PLAGE / LELEM POS ELEM PLAGE)
 (if (= (type NB) 'STR)
   (setq NB (distof (numonly NB)))
 )
 (while (setq POS (vl-string-position 44 PLAGE))
   (if (setq ELEM (borne (substr PLAGE 1 POS)))
     (setq LELEM (cons ELEM LELEM))
   )
   (setq PLAGE (substr PLAGE (+ POS 2)))
 )
 (if (setq ELEM (borne PLAGE))
   (setq LELEM (cons ELEM LELEM))
 )
 (setq LELEM (reverse LELEM))
(print NB)
(print LELEM)
 (apply 'or
   (mapcar
     '(lambda (x)
       (and
         (<= (car x) NB)
         (>= (cadr x) NB)
       )
     )
     LELEM
   )
 )
)


(defun c:plage ()
 (in "-50abc" "-55:-45,sfs:66,100,800,df")
) 

 

un premier jet

 

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)

coucou

 

je suis frustré au dernier degré

 

je regarde souvent passer les "challenge"

mais si je ne réponds pas,

ce n'est pas que je soit une bille en Lisp

je n'ai rien à prouver à personne, par ailleurs...

 

mais c'est simplement parce que je ne comprends JAMAIS

au grand JAMAIS les énoncés

 

suis-je le seul dans ce cas ?

 

le dernier ne déroge pas à la règle,

 

amicalement désolé

Posté(e)

mais c'est simplement parce que je ne comprends JAMAIS

au grand JAMAIS les énoncés

 

il est vrai que l'énoncé était un peu succin, d'où les différentes questions et réponses qui sont tombées dans la foulée.

 

J'aime bien ces challenges parce que, quand j'essaye d'y répondre, il me faut trois pages de code et d'autres, qui se reconnaitront, font preuve d'une concision exemplaire. Ma frustration est là ;)

 

Dans le code que je donne plus haut, il y a une erreur de logique dans la fonction (numonly ...). D'abord je conserve les caractères "+" pour les supprimer par la suite. Autant les supprimer tout de suite, j'y gagnerai en concision.

 

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)

J'aimerais le faire moi aussi.

Je préfère ne pas me lancer car j'ai beaucoup de boulot et d'occupations jusqu'à dimanche inclu !

Le temps de faire un ou deux post, ok, mais créer une belle routine bien conscise m'exiterait si je pouvais me concentrer.

 

Téléphone !

Qu'est-ce que je disais ?!

 

On verra bien, à +

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Zebulon_

 

Sympa le lisp. Tu utilises une liste par paire. Bien vu

J'ai fais autrement en utilisant au max la lecture par caractère

 (defun in(nb str / lst pos txt val val2 valid)
   (and (eq (type nb) 'STR)
     (setq nb (read nb))
   )
   (setq pos 1)
   (while (/= (setq val (substr str pos 1)) "")
     (cond
((eq val ":")
  (if txt
    (setq lst (cons "to" (cons (read txt) lst)))
    (setq lst (cons "to" lst))
  )
  (setq txt nil)
)
((member val '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "." "-"))
  (if txt
    (setq txt (strcat txt val))
    (setq txt val)
  )
)
(T
  (and txt (setq lst (cons (read txt) lst)))
  (setq txt nil)
)
     )
     (setq pos (1+ pos))
   )
   (setq lst (reverse (vl-remove '- (if txt (cons (read txt) lst) lst)))
  pos 0
   )
   (if (member nb lst)
     (setq valid T)
     (while (setq val (nth pos lst))
(and (eq (nth (1+ pos) lst) "to")
     (setq val2 (nth (+ 2 pos) lst))
     (< val nb)
     (> val2 nb)
  (setq valid T
	pos (length lst)
  )
)
(setq pos (1+ pos))
     )
   )
   valid
 )

 

Tramber

Il est pas toujours facile de répondre à un challenge, mais c'est oh combien stimulant.

Par contre, dès qu'il y a de la 3D, je suis largué

 

Didier

Si tu es frustré au dernier degré, ça va, il y a encore de la marge vers le 1er ;)

C'est juste une "frustratonnette" :D

Il est vrai que j'ai été peu prolixe sur le 1er message, mais on m'a vite fait corriger le tir.

Mais cela n'empêche pas de te lancer, même si tu as rien à prouver

 

@+

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,

 

J'étais en déplacement, ça a permis à certains de répondre.

Je donne les réponses que j'avais faites hier (le cachet du post faisant foi ;) )

 

Les deux réponses utilisent la routine str2lst (une de celles que j'utilise le plus)

 

méthode 'while'

(defun str2lst (str sep / pos)
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
  (str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
)

(defun in (n l / x r)
 (setq l (str2lst l ","))
 (or (numberp n) (setq n (atof n)))
 (while (and (not r) l)
   (setq x (mapcar 'atof (str2lst (car l) ":"))
  l (cdr l)
   )
   (if	(or (= (car x) n) (      (setq r T)
   )
 )
 r
)

 

méthode 'vl-some'

(defun str2lst (str sep / pos)
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
  (str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
)

(defun in (n l)
 (or (numberp n) (setq n (atof n)))
 (vl-some
   '(lambda (x) (or (= (car x) n) (    (mapcar '(lambda (x) (mapcar 'atof (str2lst x ":")))
    (str2lst l ",")
   )
 )
)

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

Posté(e)

Chapeau (gile)

 

Je ne connaissais pas (<= (car x) n (cadr x))

Tu as réduit deux conditions en une seul :D

 

Par contre,avec vl-some, une boucle supplémentaire

 

A la lecture de ton lisp, j'en conclus qu'il est plus efficace de travailler avec des listes qu'avec des caractères.

J'en avais l'intuition, maintenant, j'en ai la confirmation.

 

je me suis amusé à rependre ton idée de routine str2lst pour en faire une en itérative

 

(defun str3lst (str sep / lst pos)
 (while (setq pos (vl-string-search sep str))
   (setq lst (cons (substr str 1 pos) lst)
  str (substr str (+ (strlen sep) pos 1))
   )
 )
 (reverse (cons str lst))
)

 

Je donne les réponses que j'avais faites hier (le cachet du post ;) faisant foi )

Le malin, dans le forum test :cool:

On n'a jamais douté de toi ;)

 

@+

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)

str2lst est ce que j'ai cherché à faire vendredi.

 

Je ne l'ai pas ici mais mon but était de traiter en récursif et j'y étais arrivé en utilisant Vl-position et substr le résultat était moins concis. Moins classe !

 

Le reste, je n'ai pas regardé, je snobe les problèmes de liste. Mais j'ai souvent à faire avec les listes en string séparées par des virgules vers des liste Autolisp et inversement. J'ai donc intégré des routines depuis longtemps mais elle datent d'une époque où je connaissais à peine le VLisp. (du coup j'ai pas osé les montrer).

 

Depuis l'autre jour : beuaoucp de boulot, du temps pour ma copine et toute la journée à remettre en état des deudeuches pour une expo + un copain qui monte son local traiteur et qui a fait plein de conneries, faute de plans, comme d'hab !

Au secours Tramber !

 

Challenge 32 : encore perdu !

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

coucou

 

quand je parle de frustration, c'est une vue de l'esprit car je ne connais pas ces affres,

mais par contre, au risque assumé de me choper la honte,

je n'ai toujours pas compris ce qu'il fallait faire ...

 

je ne mets pas en cause la clarté des énoncés,

puisque les autres répodent c'est que c'est compréhensible par des humains

non c'est moi qui suis hermétique, point final ou pas humain...

 

désolé

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é