明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: caoyin

[源码] [活动结束]LISP知识问答第1期--基础篇1(难度指数:★★)

  [复制链接]
发表于 2010-12-22 03:08 | 显示全部楼层
(6)本题15分:
         求表中的数字与指定数字之差最大或最小的数字
         [格式](NumExty Num NumLst Mode)
         [说明]Num——数字
                  NumLst——数字列表
                  Mode——为 T 求之差最大,nil 求之差最小
         [测试范例]
                 (NumExty 5.181 '(4.9 5.175 6 9.181 5.182 1.181 5.181 5.1) T)->9.181

问:这个之差是求绝对值还是用表内值减去Num或是Num减去表内值的差值(有正负)
如果是求绝对值的差,那么
(NumExty 5.181 '(4.9 5.175 6 9.181 5.182 1.181 5.181 5.1) T)
应该返回 '(9.181 1.181)   ,或者返回1.181也算对?都是相差4
不知道我问清楚了没有,呵呵
 楼主| 发表于 2010-12-22 03:20 | 显示全部楼层
狂刀说的没错,谢谢指正!
(NumExty 5.181 '(4.9 5.175 6 9.181 5.182 1.181 5.181 5.1) T)
应该返回 '(9.181 1.181),
发表于 2010-12-22 13:19 | 显示全部楼层
;; 判断表 Lst 是否是点对表
;; (consP '(0 . "AA"))
(defun consP (lst)
  (if (vl-list-length lst)
    nil
    t
  )
)

评分

参与人数 1明经币 +1 收起 理由
caoyin + 1

查看全部评分

发表于 2010-12-22 15:41 | 显示全部楼层
本帖最后由 狂刀lxx 于 2010-12-22 15:43 编辑
  1. ;|(1)本题5分:
  2.         判断表 Lst 是否是点对表
  3.         [格式](consP Lst)
  4.         [测试范例](consP '(0 . "AA"))->T
  5.                   (consP '(0  "AA")) ->nil
  6.                   (consP (list 0 (cons 0 "AA"))) ->nil
  7.                   (consP (vl-list* 1 2 0)) -> T ;按此方法生成的表也叫点对表(详cad帮助)
  8. |;
  9. (defun consp (lst)
  10.   (not(vl-list-length lst))
  11. )
没注意,跟xyp的发重了,不好意思
发表于 2010-12-22 18:31 | 显示全部楼层
本帖最后由 caoyin 于 2011-1-22 23:43 编辑


为活跃气氛,上传本人1~8题解决方案的程序,摆擂台

附件是有密码的,围观群众先不要下载



-----------------------以下为答题内容------------------------------
;|(1)本题5分:
        判断表 Lst 是否是点对表
        [格式](consP Lst)
        [测试范例](consP '(0 . "AA"))->T
                  (consP '(0  "AA")) ->nil
                  (consP (list 0 (cons 0 "AA"))) ->nil
                  (consP (vl-list* 1 2 0)) -> T ;按此方法生成的表也叫点对表(详cad帮助)
|;
(defun consp (lst)
  (not(vl-list-length lst))
)
答案完全正确,本题得分5分

;;;(2)本题5分:
;;;        判断指定数据是否是点
;;;        [格式](PointP Data)
;;;        [测试范例](PointP '(0 1 2))->T
;;;                  (PointP  '(0 "a" 2.))-> nil
;;;                  (PointP  '(0  2.)) ->T
(defun pointp (data)
  (and (member (vl-list-length data) '(2 3))
       (not(member 'nil (mapcar 'numberp  data)))
  )
)
答案完全正确,本题得分5分

;;;(3)本题5分:
;;;        写一句代码将变量
;;;         MJTD1,MJTD2,MJTD3,...,MJTD1000
;;;         赋值为
;;;         1,2,3,...,1000
(repeat (progn (setq i 0) 1000) (set (read(strcat "MJTD" (itoa (setq i (1+ i))))) i))

答案完全正确,本题得分5分(答题严谨,另特殊加分: +0.5分)
其他答题者写出的其实是2句话或者更多



;;;(4)本题5分:
;;;         判断指定数据是否为偶数
;;;         [格式](EvenP DATA)
;;;         [测试范例](EvenP 5)->nil
;;;  (EvenP -6) -> T  (EvenP 0) -> T (EvenP 7) -> nil  (EvenP 6.0) -> nil  (EvenP "a") -> nil
(defun evenp (data)
  (and (= 'INT (type data))
       (= (/ data 2) (/ data 2.))
  )
)

;; 方法2
(defun evenp (data)
  (and (= 'INT (type data))
       (= 0 (boole 1 data 1))
  )
)
答案完全正确,本题得分5分(方法特殊另加分: +0.5分)


;;;(5)本题10分:
;;;        截取表的局部
;;;        [格式](ListSub Lst Sta Len)
;;;        [说明]Lst——表
;;;                Sta——开始元素位置(第一个元素位置为 0)
;;;                Len——以 sta 开始的长度,如果为 nil 则获取到最后
;;;        [测试范例](lstsub '(1 2 3 4 5 6 7) 1 5)->(2 3 4 5 6)

;| (xl-subst lst n m) = 取子表(N位開始,M 長度的子表.)
参数: lst,n,m = 表,起点位置,子表长(正整数,往右算;负整数,为往左计算).
返回: 子表或nil.
说明: (xl-sub lsts simkey) 为多表求差,注意区别.
测试:
(setq lst '(0 1 2 3 4 5 6 7 8 9 10))
(xl-subst lst 3 5) -> (3 4 5 6 7)
(xl-subst lst 3 -5) -> (0 1 2)
(xl-subst lst 9 -5) -> (4 5 6 7 8)
(xl-subst lst 8 15) -> (8 9 10)
(xl-subst lst 8 nil) ->
|;
(defun xl-subst (lst n m / nm i lst2)
  (if m
    (if (minusp m)(setq m (abs m)n (- n m)))
    (setq m (length lst))
  )
  (setq nm (1-(+ n m)))
  (setq i -1)
  (mapcar '(lambda(x)(if (<= n (setq i (1+ i)) nm)(setq lst2 (cons x lst2)))) lst)
  (reverse lst2)
)

答案完全正确,本题得分10分
功能比答题要求更多
;;;
;;;(6)本题15分:
;;;         求表中的数字与指定数字之差最大或最小的数字
;;;         [格式](NumExty Num NumLst Mode)
;;;         [说明]Num——数字
;;;                  NumLst——数字列表
;;;                  Mode——为 T 求之差最大,nil 求之差最小
;;;         [测试范例]
;;;                 (NumExty 5.181 '(4.9 5.175 6 9.181 5.182 1.181 5.181 5.1) T)-> '(9.181 1.181)
;;;             (NumExty 5.181 '(4.9 5.175 6 9.181 5.182 1.181 5.181 5.1) nil) -> 5.181
(defun NumExty (Num NumLst Mode / lst lst2 a i)
  (setq lst (mapcar '(lambda (x) (abs (- x num))) numlst))
  (setq a (apply (if MODE 'max 'min) lst)
i 0
  )
  (mapcar '(lambda (x y)(if (equal a x 1e-6)(setq lst2 (cons y lst2))))
   lst
   numlst
  )
  (if (= 1 (length lst2))
    (car lst2)
    lst2
  )
)
答案完全正确,本题得分15分(答题严谨,另特殊加分: +2分)


;;;(7)本题15分:
;;;        判断文件名是否合法(不包含无效字符)
;;;                [格式](FileName-Valid FileName)
;;;        [说明]FileName——不包含路径和扩展名的文件(或路径)名。
;;;        [测试范例](FileName-Valid "Auto*Lisp")->nil
(defun FileName-Valid (FileName / F)
  (if (setq f (open FileName "a") )
    (not (close f))
    nil
    )
)
本题得1分
扣分理由:用open是否会产生一个垃圾文件,虽然返回结果是对的,但对于狂刀扣分自然要狠一点

狂刀的答案也可以作为判断文件是否被占用
;;;
;;;(8)本题40分(加难讨论题):
;;;        判断两个文件名是否是同一个文件(或路径)。
;;;       [格式](FileName-Equal FileName1 FileName1)
;;;       [说明]两个参数都是包含绝对路径的文件名(可以理解为文件实际存在),可能各自的大小写不同、\\或/符号不同、长短路径名不同,
;;;       如何判断两个文件名指向的是不是同一个文件。
;;;(setq f1 "c:\\ab aaa~2\\fffffF~1.txt"
;;;      f2 "c:\\ab aaaaggggg\\fFffFFFff.txt")
;;;(FileName-Equal f1 f2)
;; 注:路径和文件如果是8.3短格式,胡乱写一个来验证本程序是没有意义的。应根据dos返回的名称才有意义。
;; 同一个路径,如果是 c:\xxxxxxxx, 此时8.3格式返回c:\xxxxxx~1,在改名后,如改为c:\x xxxxxxY,dos返回c:\xxxxxx~2,而不是~1,且自动去除空格
;; (即便该目录内只有这一个文件),因为在文件分配表中已经不一样了。
;; 因此胡乱写一个人为修改带~的文件名来验证本程序是没有实际意义的。
(defun FileName-Equal (F1 F2)
  (defun getshot (fn / fso ff fn)
    (setq fso (vlax-get-or-create-object "Scripting.FileSystemObject")
   ff  (vlax-invoke fso 'getfile fn)
   fn  (vlax-get ff 'ShortPath)
    )
    (vlax-release-object fso)
    fn
  )
  (if (not(wcmatch f1 "*`~*"))(setq f1(getshot f1)))
  (if (not(wcmatch f2 "*`~*"))(setq f2(getshot f2)))
  (equal (strcase f1) (strcase f2))
)

答案完全正确,本题得分40分


--------------------------------------------------------------------------
总得分:96+3分特殊加分=99分
点评:
高手应该具备的素质不仅仅是算法精和技术全,严谨的编程习惯更是让人敬佩的。
——狂刀的摆擂台成功!

谢谢狂刀对本次活动提出的意见,向高手致敬!祝新年快乐!





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2威望 +2 明经币 +6 金钱 +60 收起 理由
caoyin + 1 + 3 + 30 要两个人合力加分啊,呵呵
ZZXXQQ + 1 + 3 + 30 这是本擂台得到的最佳答案。

查看全部评分

 楼主| 发表于 2010-12-22 19:19 | 显示全部楼层
有好戏看!期待中。。。
发表于 2010-12-22 23:18 | 显示全部楼层
MARK~~~~~~~~~
留名  支持~~~
发表于 2010-12-23 00:13 | 显示全部楼层
个人认为应该公开代码,互相借鉴,参考,启发灵感,共同提高,这才是最佳目标...
发表于 2010-12-23 00:45 | 显示全部楼层
第8题中的 "长短路径名不同" 指的是什么呀?
是指 Win系统的 LongFileName.ext 与老的 8.3 格式 不同 ?
发表于 2010-12-23 19:00 | 显示全部楼层
本帖最后由 caoyin 于 2010-12-23 19:02 编辑
e2002 发表于 2010-12-23 00:13
个人认为应该公开代码,互相借鉴,参考,启发灵感,共同提高,这才是最佳目标...


是的,代码肯定要公开的,只是要等活动结束

e2002 发表于 2010-12-23
第8题中的 "长短路径名不同" 指的是什么呀?
是指 Win系统的 LongFileName.ext 与老的 8.3 格式 不同 ?

是的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-17 19:09 , Processed in 0.164876 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表