找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3065|回复: 13

[有奖答题] 写一个简短的程序,插入一个新的数值到一个排好序的表中。

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-5-7 20:32:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
国外的题目:
写一个简短的程序,插入一个新的数值到一个排好序的表中。
假如: 已有表'(10000 9000 8000 7000 6000)
现在有一个新的记录,8500,要插入进来,变成表'(10000 9000 8500 8000 7000 )
维持表的长度不变,那个最小的被移走了。
如果新记录比表中元素都小,则表不变。
以下原文(我只是意译)
How to write the shortest lisp using mapcar or lambda to insert a value into a list. Say I have 5 scores - (list 10000 9000 8000 7000 6000). And a new high score of 8500 to insert into this list, meaning the result is 10000 9000 8500 8000 7000. Always end with 5 highest score only, notice the last item in the list 6000 is removed from the list. I have written a lisp but its quite long. I wondered if using mapcar or lambda will shorten the lisp ??

呵呵,欢迎大家练习一下。

格式例如如下:
(f '(9 8 7 6 5 3) 1)  ; (9 8 7 6 5 3)
(f '(9 8 7 6 5 3) 10) ; (10 9 8 7 6 5)
(f '(9 8 7 6 5 3) 3)  ; (9 8 7 6 5 3)
(f '(9 8 7 6 5 3) 5)  ; (9 8 7 6 5 5)
(f '(9 8 7 6 5 3) 4)  ; (9 8 7 6 5 4)
(f '(9 8 7 6 5 3) 9)  ; (9 9 8 7 6 5)







论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-5-7 21:33:02 来自手机 | 显示全部楼层
(reverse (cdr (vl-sort (cons num lst) '<)))来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 74个

财富等级: 招财进宝

发表于 2013-5-7 22:25:01 | 显示全部楼层
本帖最后由 黑洞—杜明智 于 2013-5-7 23:02 编辑

[pcode=c,true](defun f (lst num / lst1 x lst2 rtn)
  (setq lst1 (cons num lst))
  (setq rtn (reverse
                       (cdr (foreach x (vl-sort-i lst1 '>)
                                 (setq lst2 (cons (nth x lst1) lst2))
                               )
                        )
                 )
  )
(princ rtn)
)[/pcode]

测试结果!

(f '(9 8 7 6 5 3) 1)  ; (9 8 7 6 5 3)

(f '("m" "k" "g" "e" "b" "a") "d")  ;("m" "k" "g" "e" "d" "b")

暂时测试无BUG,但总感觉代码还可以精简,暂时没思路,楼主指导下。

点评

(defun ff(l i)(setq i(cons i l))(mapcar'(lambda(a l)(nth l i))l(vl-sort-i i(if(>(car l)(last l))'>'<))))  发表于 2016-9-4 20:04
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-5-8 00:42:51 | 显示全部楼层
[pcode=lisp,true](defun ff (lst num / tf)
  (mapcar '(lambda (x /)
             (if (> x num)
               x
               (if tf
                 x
                 (progn (setq tf t) num)
               )
             )
           )
          lst
  )
)[/pcode]

点评

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

使用道具 举报

已领礼包: 207个

财富等级: 日进斗金

发表于 2013-5-8 10:33:46 | 显示全部楼层
本帖最后由 xshrimp 于 2013-5-8 10:40 编辑

根据楼上的改一下
[pcode=lisp,true](defun f (lst n / r p)
  (mapcar
  '(lambda (x)
    (cond
      ((>= x n) x)
      (r (setq r p p x) r)
      (t (setq p x r n ))
    )   
   )
  lst
  )
)[/pcode]

(mapcar '(lambda(x)(f  '(9 8 7 6 5 3) x)) '(1 10 3 5 4 9))
=>
(
(9 8 7 6 5 3)
(10 9 8 7 6 5)
(9 8 7 6 5 3)
(9 8 7 6 5 5)
(9 8 7 6 5 4)
(9 9 8 7 6 5)
)

点评

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

使用道具 举报

已领礼包: 1861个

财富等级: 堆金积玉

发表于 2014-4-16 09:44:01 | 显示全部楼层
(defun ff (lst n)
   (setq  newlst '())
   (setq addlst (cons n lst))
   (setq numlst (vl-sort-i addlst '<))
   (foreach i numlst
          (setq newlst (cons (nth i addlst) newlst))
   )
   (if (> (car (reverse newlst)) n)
       (newlst)
       (reverse (cdr (reverse newlst)))
    )
)
(ff '(10000 9000 8000 7000 6000) 8500)

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

使用道具 举报

发表于 2016-9-4 19:08:05 | 显示全部楼层
本帖最后由 llsheng_73 于 2016-9-4 20:02 编辑

  1. (defun ff(l i)(setq i(cons i l))(mapcar'(lambda(a l)(nth l i))l(vl-sort-i i(if(>(car l)(last l))'>'<))))

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

使用道具 举报

发表于 2016-11-13 20:14:15 来自手机 | 显示全部楼层
(defun f(lst num)   (reverse     (cdr       (reverse         (append           (vl-remove-if '(lambda(x)(<= x num)) lst)           (cons num (vl-remove-if '(lambda(x)(/= x num)) lst))           (vl-remove-if '(lambda(x)(>= x num)) lst)         )       )     )   ) )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-11-13 20:15:21 来自手机 | 显示全部楼层
没用排序,计算速度应该快些,就是有点长
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2016-11-17 01:42:13 | 显示全部楼层
三年多时间了,这个奖还没发出去,高飞鸟有什么更好的思路,提示提示。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 13:08 , Processed in 0.521710 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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