明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3132|回复: 39

[讨论] 一个有趣的表变换,请各位网友不吝赐教,谢谢

[复制链接]
发表于 2022-2-24 11:33:56 | 显示全部楼层 |阅读模式
50明经币
本帖最后由 夏生生 于 2022-2-25 08:47 编辑

(大家表示看不懂需求,我修改了下,尽量表述清晰)

最近碰到一个比较有趣的表变换的问题,能力有限,特来求教。
三楼自己写了一段代码,针对的是两两组合(n=2)的情况,所以没有输入n,只输入了dlst和m,希望大家提供更好的算法,并完善,再次感谢!
输入:dlst--表'(a1 a2 ai ai+1 ai+2...aj-2 aj-1  aj aj+1 aj+2...ak)
          m----组合表长
          n-----向前取表长度
需求:1.从a1开始,依次截取长度为n的表(ai ai+1 ai+2...aj-2 aj-1  aj),当j小于n时,截取(a1 a2...aj);
          2.对表(ai ai+1 ai+2...aj-2 aj-1  aj)进行变换,变换为表长为m的表,变换规则如下:
        (1)表头、尾均为aj;
        (2)第1次组合,结果为(aj ai ..ai aj),表长为m,直至组合到(aj aj-1 ..aj-1 aj);
        (3)第2次组合,结果为(aj aj  ai ..ai aj  aj),表长为m,直至组合到(aj aj aj-1 ..aj-1 aj aj);
        (4)一直组合到(aj aj ..aj aj);
          3.把前面所有的变换结果组合成一个表。
举例:
(setq dlst '(1 2 3 4)  m   5  n 2)--->
(
  ((1 1)                 (1 1 1)                      (1 1 1 1)                                                    (1 1 1 1 1))
  ((2 2)          (2 1 2)(2 2 2)            (2 1 1 2)(2 2 2 2)                (2 1 1 1 2)              (2 2 1 2 2)(2 2 2 2 2))
  ((3 3)(3 1 3)(3 2 3)(3 3 3)(3 1 1 3)(3 2 2 3)(3 3 3 3)(3 1 1 1 3)(3 2 2 2 3)(3 3 1 3 3)(3 3 2 3 3)(3 3 3 3 3))
  ((4 4)(4 2 4)(4 3 4)(4 4 4)(4 2 2 4)(4 3 3 4)(4 4 4 4)(4 2 2 2 4)(4 3 3 3 4)(4 4 2 4 4)(4 4 3 4 4))(4 4 4 4 4))
  )
表(ai ai+1 ai+2...aj-2 aj-1  aj)变换的示例
如m=7,n=2(nth (- j 2) dlst)=a,(nth (- j 1) dlst)=b,(nth j dlst)=c
结论为
((c c)(c a c)(c b c)(c c c)(c a a c)(c b b c)(c c c c)(c a a a c)(c b b b c)(c c a c c)(c c b c c)(c c c c c)(c a a a a c)(c b b b b c)(c c a a c c)(c c b b c c)(c c c c c c)(c a a a a a c)(c b b b b b c)(c c a a a c c)(c c b b b c c)(c c c a c c c)(c c c b c c c)(c c c c c c c))

最佳答案

查看完整内容

_$ (defun f1(a m n) (setq flst (list a a) i 0 j (max 1 (- a n)) vlst nil) (while (

点评

为什么没有(4 1 4)(4 1 1 4)(4 1 1 1 4)(4 4 1 4 4)?  发表于 2022-2-27 13:37
发表于 2022-2-24 11:33:57 | 显示全部楼层
夏生生 发表于 2022-2-27 15:22
非常感谢,您的逻辑能力太强了!!我试着用nth将它转成针对表看看

_$ (defun f1(a m n)   
(setq flst (list a a) i 0 j (max 1 (- a n)) vlst nil)
(while (<= j a)
(while (< i (- m 2))
  (setq fflst (list j))
  (repeat i
       (setq fflst (cons j fflst)))
  (setq vlst (cons fflst vlst))
  (setq i (+ i 1))
)
(setq j (+ j 1) i 0)
)
(setq vlst (mapcar '(lambda (x) (cons a (reverse (cons a x)))) vlst))
(setq vlst (cons flst (reverse vlst)))
)
F1
_$ (f1 3 5 2)
((3 3) (3 1 3) (3 1 1 3) (3 1 1 1 3) (3 2 3) (3 2 2 3) (3 2 2 2 3) (3 3 3) (3 3 3 3) (3 3 3 3 3))
_$ (f1 4 5 2)
((4 4) (4 2 4) (4 2 2 4) (4 2 2 2 4) (4 3 4) (4 3 3 4) (4 3 3 3 4) (4 4 4) (4 4 4 4) (4 4 4 4 4))
_$ (f1 5 5 2)
((5 5) (5 3 5) (5 3 3 5) (5 3 3 3 5) (5 4 5) (5 4 4 5) (5 4 4 4 5) (5 5 5) (5 5 5 5) (5 5 5 5 5))
_$
回复

使用道具 举报

发表于 2022-2-24 19:10:00 | 显示全部楼层
看不懂问题意思。

点评

谢谢您的关注,确实不是很好表达,我只能用表的形式描述  发表于 2022-2-24 19:57
回复

使用道具 举报

 楼主| 发表于 2022-2-24 19:58:56 | 显示全部楼层
mahuan1279 发表于 2022-2-24 19:10
看不懂问题意思。

我现在有了点思路,求对称表的一半,最后再镜像这个表就行了,正在完善
回复

使用道具 举报

 楼主| 发表于 2022-2-24 21:51:49 | 显示全部楼层
写了一个,写得很啰嗦,没有看懂前面问题的,可以根据下面代码的返回值理解题意,还要请各位帮忙优化,谢谢
(tmp '(1 2 3 4) 5)--->
'(((1 1) (1 1 1) (1 1 1 1) (1 1 1 1 1)) ((2 2) (2 1 2) (2 2 2) (2 1 1 2) (2 2 2 2) (2 1 1 1 2) (2 2 1 2 2) (2 2 2 2 2)) ((3 3) (3 1 3) (3 2 3) (3 3 3) (3 1 1 3) (3 2 2 3) (3 3 3 3) (3 1 1 1 3) (3 2 2 2 3) (3 3 1 3 3) (3 3 2 3 3) (3 3 3 3 3)) ((4 4) (4 2 4) (4 3 4) (4 4 4) (4 2 2 4) (4 3 3 4) (4 4 4 4) (4 2 2 2 4) (4 3 3 3 4) (4 4 2 4 4) (4 4 3 4 4) (4 4 4 4 4)))

  1. ;;;对表内原子进行变换
  2. ;;;a-----原子
  3. ;;;b-----a前一位原子
  4. ;;;c-----a前二位原子
  5. ;;;i-----最大表长
  6. (defun tmp1 (a b c i / lst lst1 lst2 lst3 lstt n oi)
  7.   (setq n 0)
  8.   (if (= (rem i 2) 1)
  9.     (setq i  (/ (1+ i) 2)
  10.     oi nil
  11.     ) ;_奇数
  12.     (setq i  (/ i 2)
  13.     oi t
  14.     ) ;_偶数
  15.     )
  16.   (while (> i 0)
  17.     (repeat i
  18.       (setq lst1 (cons a lst1))
  19.       )
  20.     (if  b
  21.       (repeat n
  22.   (setq lst2 (cons b lst2))
  23.   )
  24.       )
  25.     (if  c
  26.       (repeat n
  27.   (setq lst3 (cons c lst3))
  28.   )
  29.       )
  30.     (if  (= 0 n)
  31.       (setq lst (cons lst1 lst))
  32.       (setq lst  (if lst2
  33.       (cons (append lst1 lst2) lst)
  34.       lst
  35.       )
  36.       lst  (if lst3
  37.       (cons (append lst1 lst3) lst)
  38.       lst
  39.       )
  40.       )
  41.       )
  42.     (setq n    (1+ n)
  43.     i    (1- i)
  44.     lst1 nil
  45.     lst2 nil
  46.     lst3 nil
  47.     )
  48.     )
  49.   (while (and(< 0(length(car lst)))(< 0 (setq i (length lst))))
  50.     (setq lstt (append (mapcar '(lambda  (x)
  51.           (if oi
  52.             (append x (reverse x))
  53.             (append x (cdr (reverse x)))
  54.             )
  55.           )
  56.              lst
  57.              )
  58.            lstt
  59.            )
  60.     lst  (if oi
  61.      lst
  62.      (if b
  63.        (if c
  64.          (mapcar '(lambda (x) (xty-L-carn (1- (length x)) x))
  65.            (xty-L-carn (- i 2) lst)
  66.            )
  67.          (mapcar '(lambda (x) (xty-L-carn (1- (length x)) x))
  68.            (xty-L-carn (- i 1) lst)
  69.            )
  70.          )
  71.        (mapcar 'cdr lst)
  72.        )
  73.      )
  74.     oi   (null oi)
  75.     )
  76.     )
  77.   (cdr lstt)
  78.   )
  79. ;;;=============================================
  80. ;;;      通用函数 保留表前n项
  81. ;;;参数:n------需保留的个数1开始
  82. ;;;      lst----表
  83. ;;;返回值保留表前n项的新表
  84. (defun xty-L-carn  (n lst / lsta)
  85.   (setq lsta nil)
  86.   (repeat n
  87.     (setq lsta (append lsta (list (car lst)))
  88.     lst  (cdr lst)))
  89.   lsta)
  90. (defun tmp (dlst i / n)
  91.   (setq n -2)
  92.   (mapcar '(lambda (x)
  93.        (setq n (1+ n))
  94.        (cond ((= -1 n) (tmp1 x nil nil i))
  95.        ((= 0 n) (tmp1 x (car dlst) nil i))
  96.        ((< 0 n) (tmp1 x (nth n dlst) (nth (1- n) dlst) i))
  97.        )
  98.        )
  99.     dlst
  100.     )
  101.   )


回复

使用道具 举报

发表于 2022-2-24 23:53:37 | 显示全部楼层
我汉语八级也表示看不懂。

点评

抱歉,我在一楼修改了需求,可否麻烦您再看看,谢谢  发表于 2022-2-25 08:37

评分

参与人数 1明经币 +1 收起 理由
夏生生 + 1 谢谢您的关注

查看全部评分

回复

使用道具 举报

发表于 2022-2-25 00:39:45 | 显示全部楼层
本帖最后由 mahuan1279 于 2022-2-25 00:47 编辑

大概看懂题意了。最大长度为n,表lst中取若干元素构成的对称表的所有集合。如n=3,lst=’(1  2  3)则结果为((1 1)(1 1 1)(1 2 1)(1 3 1)(2 2)(2 2 2)(2 1 2)(2 3 2)(3 3)(3 3 3)(3 1 3)(3 2 3))。递归思路。

评分

参与人数 1明经币 +1 收起 理由
夏生生 + 1 谢谢您的关注

查看全部评分

回复

使用道具 举报

发表于 2022-2-25 08:29:33 来自手机 | 显示全部楼层
mahuan1279 发表于 2022-2-25 00:39
大概看懂题意了。最大长度为n,表lst中取若干元素构成的对称表的所有集合。如n=3,lst=’(1  2  3)则结果 ...

你这个理解不全对,都是两头大中间小的回文子表。

评分

参与人数 1金钱 +5 收起 理由
夏生生 + 5 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2022-2-25 08:31:53 来自手机 | 显示全部楼层
有个思路就是先得到一半表,颠倒后连接前一半。

点评

我在三楼的代码就是这个思路  发表于 2022-2-25 08:37
回复

使用道具 举报

 楼主| 发表于 2022-2-25 08:49:54 | 显示全部楼层
mahuan1279 发表于 2022-2-25 00:39
大概看懂题意了。最大长度为n,表lst中取若干元素构成的对称表的所有集合。如n=3,lst=’(1  2  3)则结果 ...

谢谢您的关注,我在一楼修改并尽力明确了需求,能否麻烦您再看下,谢谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 14:31 , Processed in 0.458146 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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