淮上 发表于 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
俺再来一个!速度更快点的

飞诗这个最快
其他的大家也做做题目
页: 1 [2] 3 4
查看完整版本: [活动结束]LISP知识问答第2期--基础篇2-(难度指数:★)