淮上
发表于 2010-12-29 20:07:10
;|6.按指定长度,分割一个表,成多个小表
格式:(ListSplit1 lst len)
lst:要分割的表
len:int 子表长度
比如:(ListSplit1 '(0 1 2 3 4 5 6 7 8 9) 3)
返回 '((0 1 2) (3 4 5) (6 7 8) (9))
|;
(defun ListSplit1(lst len /nl)
(while (and lst(> (length lst) len))
(setq nl1 nil)
(repeat len
(setq nl1 (cons (car lst)nl1)
lst (cdr lst))
)
(setq nl (cons (reverse nl1) nl))
)
(reverse (cons lstnl))
)
我新手 咱也试试
淮上
发表于 2010-12-29 21:27:02
(defun c:test()
(setq date (getvar "cdate"))
(setq date2 (read (strcat (substr (rtos date 2 16) 14 2) "." (substr (rtos date 2 16) 16 3))))
(repeat 1000000
(ListSplit2 '(0 1 2 3 4 5 6 7 8 9) 3)
)
(setq date3 (getvar "cdate"))
(setq date4 (read (strcat (substr (rtos date3 2 16) 14 2) "." (substr (rtos date3 2 16) 16 3))))
(strcat "运行时间" (rtos (- date4 date2)2 2) "秒"))
测试时间的程序
461045462
发表于 2010-12-31 07:44:13
来学习了
支持这样的活动,可以让初学者更快成长
谢谢
Lisper
发表于 2011-1-1 22:55:49
;|6.按指定长度,分割一个表,成多个小表
格式:(ListSplit1 lst len)
lst:要分割的表
len:int 子表长度
比如:(ListSplit1 '(0 1 2 3 4 5 6 7 8 9) 3)
返回 '((0 1 2) (3 4 5) (6 7 8) (9))
|;
(defun ListSplit1 (ls len / a r i)
(setq i 0)
(foreach item ls
(setq a (append tmp(list item)))
(setq i(1+ i))
(if(zerop(rem i len))
(setq r(cons tmp r) a nil)
)
)
(if a (setq r(cons tmp r) a nil))
(reverse r)
)
;|测试:用淮上的测试程序测试,
命令: TEST
"运行时间16.49秒"|;
Lisper
发表于 2011-1-1 23:40:35
;|5.返回指定图元后的所有图元组成的表
格式:(EntNextAll ent)
ent:指定的标志图元
返回:图元之后生成的所有图元组成的表.
特别:当ent为nil时返回图中所有的图元组成的表|;
(defun EntNextAll (ent / ls ent1 rl flag)
(if (not ent) (setq ent (entnext) flag t))
(while (setq ent1(entnext ent))
(setq rl (cons ent1 rl))
(setq ent ent1)
)
(if flag (cons (entnext) (reverse rl)) (reverse rl))
)
露水2
发表于 2011-1-2 13:21:46
本帖最后由 露水2 于 2011-1-2 13:40 编辑
淮上的 测试函数有点问题
飞诗(fsxm)
发表于 2011-1-2 18:41:03
原装
(defun ListSplit1 (lst int / len n nlst tmplst)
(repeat (/ (length lst) int)
(repeat int
(setq tmplst (cons (car lst) tmplst))
(setq lst (cdr lst))
)
(setq nlst (cons (reverse tmplst) nlst))
(setq tmplst nil)
)
(reverse (if lst (cons lst nlst) nlst))
)
露水2
发表于 2011-1-2 19:17:00
本帖最后由 露水2 于 2011-1-2 19:24 编辑
经测试 100万次 表为
(ListSplit1 '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28) 3)
淮上的 "运行时间113.93秒"
lisper 的 "运行时间142.78秒"
飞诗的"运行时间113.49秒"
当表短时淮上的最快 当表长时飞诗的最快 因为淮上每次都要length
测试运算1次
表为 10万长
淮上的"运行时间16.16秒"
lipser的"运行时间0.67秒"
飞诗的"运行时间0.52秒"
飞诗(fsxm)
发表于 2011-1-2 20:13:12
本帖最后由 飞诗(fsxm) 于 2011-1-2 20:16 编辑
俺再来一个!速度更快点的
(defun ListSplit1 (lst len / i nlts tmp)
(setq i 1)
(foreach ite lst
(if
(= i len)
(setq i
1
nlts (cons (reverse (cons ite tmp)) nlts)
tmp
nil
)
(setq tmp
(cons ite tmp)
i
(1+ i)
)
)
)
(if tmp
(reverse (cons (reverse tmp) nlts))
(reverse nlts)
)
)
露水2
发表于 2011-1-4 12:14:35
飞诗(fsxm) 发表于 2011-1-2 20:13 static/image/common/back.gif
俺再来一个!速度更快点的
飞诗这个最快
其他的大家也做做题目