一个有趣的表变换,请各位网友不吝赐教,谢谢
本帖最后由 夏生生 于 2022-2-25 08:47 编辑(大家表示看不懂需求,我修改了下,尽量表述清晰)
最近碰到一个比较有趣的表变换的问题,能力有限,特来求教。
三楼自己写了一段代码,针对的是两两组合(n=2)的情况,所以没有输入n,只输入了dlst和m,希望大家提供更好的算法,并完善,再次感谢!
输入:dlst--表'(a1 a2 ai ai+1 ai+2...aj-2 aj-1aj aj+1 aj+2...ak)
m----组合表长
n-----向前取表长度
需求:1.从a1开始,依次截取长度为n的表(ai ai+1 ai+2...aj-2 aj-1aj),当j小于n时,截取(a1 a2...aj);
2.对表(ai ai+1 ai+2...aj-2 aj-1aj)进行变换,变换为表长为m的表,变换规则如下:
(1)表头、尾均为aj;
(2)第1次组合,结果为(aj ai ..ai aj),表长为m,直至组合到(aj aj-1 ..aj-1 aj);
(3)第2次组合,结果为(aj ajai ..ai ajaj),表长为m,直至组合到(aj aj aj-1 ..aj-1 aj aj);
(4)一直组合到(aj aj ..aj aj);
3.把前面所有的变换结果组合成一个表。
举例:
(setq dlst '(1 2 3 4)m 5n 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-1aj)变换的示例
如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))
夏生生 发表于 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))
_$ 看不懂问题意思。 mahuan1279 发表于 2022-2-24 19:10
看不懂问题意思。
我现在有了点思路,求对称表的一半,最后再镜像这个表就行了,正在完善 写了一个,写得很啰嗦,没有看懂前面问题的,可以根据下面代码的返回值理解题意,还要请各位帮忙优化,谢谢
(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)))
;;;对表内原子进行变换
;;;a-----原子
;;;b-----a前一位原子
;;;c-----a前二位原子
;;;i-----最大表长
(defun tmp1 (a b c i / lst lst1 lst2 lst3 lstt n oi)
(setq n 0)
(if (= (rem i 2) 1)
(setq i(/ (1+ i) 2)
oi nil
) ;_奇数
(setq i(/ i 2)
oi t
) ;_偶数
)
(while (> i 0)
(repeat i
(setq lst1 (cons a lst1))
)
(ifb
(repeat n
(setq lst2 (cons b lst2))
)
)
(ifc
(repeat n
(setq lst3 (cons c lst3))
)
)
(if(= 0 n)
(setq lst (cons lst1 lst))
(setq lst(if lst2
(cons (append lst1 lst2) lst)
lst
)
lst(if lst3
(cons (append lst1 lst3) lst)
lst
)
)
)
(setq n (1+ n)
i (1- i)
lst1 nil
lst2 nil
lst3 nil
)
)
(while (and(< 0(length(car lst)))(< 0 (setq i (length lst))))
(setq lstt (append (mapcar '(lambda(x)
(if oi
(append x (reverse x))
(append x (cdr (reverse x)))
)
)
lst
)
lstt
)
lst(if oi
lst
(if b
(if c
(mapcar '(lambda (x) (xty-L-carn (1- (length x)) x))
(xty-L-carn (- i 2) lst)
)
(mapcar '(lambda (x) (xty-L-carn (1- (length x)) x))
(xty-L-carn (- i 1) lst)
)
)
(mapcar 'cdr lst)
)
)
oi (null oi)
)
)
(cdr lstt)
)
;;;=============================================
;;; 通用函数 保留表前n项
;;;参数:n------需保留的个数1开始
;;; lst----表
;;;返回值保留表前n项的新表
(defun xty-L-carn(n lst / lsta)
(setq lsta nil)
(repeat n
(setq lsta (append lsta (list (car lst)))
lst(cdr lst)))
lsta)
(defun tmp (dlst i / n)
(setq n -2)
(mapcar '(lambda (x)
(setq n (1+ n))
(cond ((= -1 n) (tmp1 x nil nil i))
((= 0 n) (tmp1 x (car dlst) nil i))
((< 0 n) (tmp1 x (nth n dlst) (nth (1- n) dlst) i))
)
)
dlst
)
)
我汉语八级也表示看不懂。 本帖最后由 mahuan1279 于 2022-2-25 00:47 编辑
大概看懂题意了。最大长度为n,表lst中取若干元素构成的对称表的所有集合。如n=3,lst=’(123)则结果为((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))。递归思路。 mahuan1279 发表于 2022-2-25 00:39
大概看懂题意了。最大长度为n,表lst中取若干元素构成的对称表的所有集合。如n=3,lst=’(123)则结果 ...
你这个理解不全对,都是两头大中间小的回文子表。 有个思路就是先得到一半表,颠倒后连接前一半。 mahuan1279 发表于 2022-2-25 00:39
大概看懂题意了。最大长度为n,表lst中取若干元素构成的对称表的所有集合。如n=3,lst=’(123)则结果 ...
谢谢您的关注,我在一楼修改并尽力明确了需求,能否麻烦您再看下,谢谢