找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: newer

[有奖答题] 【挑战】表按照给定的数重新分组

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-6 22:54:13 | 显示全部楼层


  1. (defun c:bench ()
  2.   (setq lst '(1 2))
  3.   (repeat 14
  4.     (setq lst (append lst lst))
  5.   )
  6.   (xd::quickbench
  7.     '(
  8.                                         ;    (GroupByNum-1 lst 15)
  9.       (GroupByNum-2 lst 15)
  10.                                         ;    (GroupByNum-3 lst 15)
  11.       (LM:group<n lst 15)
  12.       (t11 lst 15)
  13.       (GroupByNum-5 lst 15)
  14.       (GroupByNum-6 lst 15)
  15.       (GroupByNum-7 lst 15)
  16.      )
  17.   )
  18. )



QQ截图20170606224853.png QQ截图20170606225344.png

还是5优势明显, 老黄的7表现也不错




论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2017-6-6 23:05:52 | 显示全部楼层
本帖最后由 iLisp 于 2017-6-6 23:06 编辑

  1. (defun divn (lst n / l rl i)
  2.   (while lst
  3.     (repeat n
  4.       (setq l        (cons (car lst) l)
  5.             lst        (cdr lst)
  6.       )
  7.     )
  8.     (setq rl (cons l rl)
  9.           l  nil
  10.     )
  11.   )
  12.   (if (< (setq i (length (car rl))) n)
  13.     (progn
  14.       (setq l (car rl))
  15.       (repeat (- n i)
  16.         (setq l (cons nil l))
  17.       )
  18.       (setq rl (cons l (cdr rl)))
  19.     )
  20.   )
  21.   (reverse (mapcar 'reverse rl))
  22. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-6 23:15:24 | 显示全部楼层

  1. (defun c:bench ()
  2.   (setq lst '(1 2))
  3.   (repeat 14
  4.     (setq lst (append lst lst))
  5.   )
  6.   (xd::quickbench
  7.     '(
  8.                                         ;    (GroupByNum-1 lst 15)
  9.       (GroupByNum-2 lst 15)
  10.                                         ;    (GroupByNum-3 lst 15)
  11.       (LM:group<n lst 15)
  12.       (t11 lst 15)
  13.       (GroupByNum-5 lst 15)
  14.       (GroupByNum-6 lst 15)
  15.       (GroupByNum-7 lst 15)
  16.       (divn lst 15)
  17.      )
  18.   )
  19. )



QQ截图20170606231409.png


5继续第一,新的DIVN稳定在第三
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2017-6-6 23:41:07 | 显示全部楼层
呀! 落后很多啊!
写个循环体里面不用reverse的
[Actionscript3] 纯文本查看 复制代码
(defun t22 (l n / a b i )  
    (setq l (reverse l) i (- n (rem (length l) n)))
    (while (and (/= i n) (> i 0))
        (setq l (cons nil l) i (1- i))
    )
    (setq i (1+ n))
    (foreach x l
        (if (> (setq i (1- i)) 0)
            (setq a (cons x a))
            (setq b (cons a b) i n a (cons x nil))
        )
    )
    (cons a b)
)

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
newer + 5 + 1

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-6 23:52:32 | 显示全部楼层


  1. (defun c:bench ()
  2.   (setq lst '(1 2))
  3.   (repeat 14
  4.     (setq lst (append lst lst))
  5.   )
  6.   (xd::quickbench
  7.     '(
  8.                                         ;    (GroupByNum-1 lst 15)
  9.       (GroupByNum-2 lst 15)
  10.                                         ;    (GroupByNum-3 lst 15)
  11.       (LM:group<n lst 15)
  12.       (t11 lst 15)
  13.       (GroupByNum-5 lst 15)
  14.       (divn lst 15)
  15.       (t22 lst 15)
  16.      )
  17.   )
  18. )


QQ截图20170606235133.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2017-6-7 00:06:47 | 显示全部楼层
改造一下

  1. (defun divn1 (lst n / l rl i)
  2.   (setq i 0)
  3.   (foreach x lst
  4.     (if        (< i n)
  5.       (setq l (cons x l))
  6.       (setq rl (cons l rl)
  7.             l  (list x)
  8.             i  0
  9.       )
  10.     )
  11.     (setq i (1+ i))
  12.   )
  13.   (if (< (setq i (length l)) n)
  14.     (repeat (- n i)
  15.       (setq l (cons nil l))
  16.     )
  17.   )
  18.   (reverse (mapcar 'reverse (cons l rl)))
  19. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-7 00:25:02 | 显示全部楼层



  1. (defun c:bench ()
  2.   (setq lst '(1 2))
  3.   (repeat 14
  4.     (setq lst (append lst lst))
  5.   )
  6.   (xd::quickbench
  7.     '(
  8.                                         ;    (GroupByNum-1 lst 15)
  9.       (GroupByNum-2 lst 15)
  10.                                         ;    (GroupByNum-3 lst 15)
  11.       (LM:group<n lst 15)
  12.       (t11 lst 15)
  13.       (GroupByNum-5 lst 15)
  14.       (divn lst 15)
  15.       (t22 lst 15)
  16.       (divn1 lst 15)
  17.      )
  18.   )
  19. )


QQ截图20170607002245.png

不如原来的



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-6-7 11:00:53 | 显示全部楼层
本帖最后由 st788796 于 2017-6-7 11:07 编辑

一个有意思的现象
用下面代码和 GroupByNum-5 对比

  1. (defun div (lst n / len m i rl)  
  2.   (foreach x  lst  )
  3. )

效率上还是 GroupByNum-5 高,也许和 堆、栈 有关,递归超量时提示的是 “堆栈溢出”
分析下GroupByNum-5 n=13 时构造的 f1

  1. (defun f1 (a)
  2.   (setq    a (cons (caddr l) (cons (cadr l) (cons (car l) a)))
  3.     l (cdddr l)
  4.   )
  5.   (setq    a (cons    (cadddr l)
  6.         (cons (caddr l) (cons (cadr l) (cons (car l) a)))
  7.       )
  8.     l (cddddr l)
  9.   )
  10.   (setq    a (cons    (cadddr l)
  11.         (cons (caddr l) (cons (cadr l) (cons (car l) a)))
  12.       )
  13.     l (cddddr l)
  14.   )
  15.   (setq    a (cons    (cadddr l)
  16.         (cons (caddr l) (cons (cadr l) (cons (car l) a)))
  17.       )
  18.     l (cddddr l)
  19.   )
  20.   (reverse a)
  21. )
根据 n 构造 里面 都是 cons car ... 执行一次 f1 , 表 l 直接减少 n 个元素
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2017-6-7 11:12:33 | 显示全部楼层

ST大师,意思是最简单的循环遍历下表(不做其他操作)效率都没GroupByNum-5 高?  细思极恐...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-6-7 11:38:45 | 显示全部楼层
本帖最后由 st788796 于 2017-6-7 12:32 编辑

我这测试如此,或许 alisp 有的是栈操作,有的是堆上操作,前者快后者慢
进一步这样测试

  1. (defun div (lst n / len m i rl)  
  2.   (while lst (setq lst (cdr lst))  )
  3. )
  4. (defun div1 (lst n / len m i rl)  
  5.   (foreach x  lst    )
  6. )
  7. (defun c:bench ()
  8.   (setq lst '(1 2))
  9.   (repeat 14 (setq lst (append lst lst)))
  10.   (xd::benchmark '((div1 lst 15) (div lst 15)))
  11. )

while 高于 foreach
命令: BENCH
Elapsed milliseconds / relative speed for 256 iteration(s):

    (DIV LST 15)......1638 / 1.57 <fastest>
    (DIV1 LST 15).....2574 / 1 <slowest>

随着 lst 的 cdr ,lst 长度减少,可能转到栈操作,foreach  一次加载了 lst 完全在堆上

以上只是个人猜测
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2017-6-7 14:02:57 | 显示全部楼层

我测试foreach要高于mapcar 高于while
所以现在能foreach就不用mapcar了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-29 22:50 , Processed in 0.198999 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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