如何以更简单的方式合并列表中的元素?序言
我正在尝试合并列表中的元素,规则如下:
1.合并一个列表,如果列表中的 2 个连续数字是相同的数字,它们应该通过求和合并成一个(即 [4,4,0,0] -> [8,0,0,0] )。
2.新合并的图块不能在同一回合与另一个图块合并(例如:[4,4,8,0] ->[8,8,0,0] 正确,但 [16,0,0,0] ] 错误的)
3.列表长度应该是4.如果列表在合并后减少,则在尾部添加一个零。(例如:[4,4,0,2] -> [8,0,2,0])。
4.零的情况下注意:[0,0,2,2] -> [0,4,0,0]。
我已经能够创建代码,但是我想找到一种更简单的方法来详细解释。
我的做法:
merge([H|T],L):-
merge2([H|T],J),
(
length(J,2)->
append(J,[0,0],L);
length(J,3)->
append(J,[0],L);length(J,4)-> J=L).
merge2(_,[]).
merge2([X],[X|_]).
merge2([H1,H2|T],[W|L]):-
H1=H2,
W is H1+H2,
merge2(T,L).
merge2([H1,H2|T],[H1|L]):-
H1=H2,
merge2([H2|T],L).
回答
长度 4 不够长,不能只写出案例:
merge( [A,B,C,D], Y) :-
( A=B -> ( C=D -> X=[A+B,C+D,0,0]
; X=[A+B,C,D,0] )
; ( B=C -> X=[A,B+C,D,0]
; ( C=D -> X=[A,B,C+D,0]
; X=[A,B,C,D] ))),
maplist(is,Y,X).
这只是根据您的规范写出案例。我们不必is每次添加两个变量时都手动调用,而是通过符号符号记下总和,使用+,is最后通过 一次调用结果的每个元素maplist。