【发布时间】:2021-03-18 15:46:58
【问题描述】:
我正在尝试合并列表中的元素,规则如下:
1. 合并列表的方式是,如果列表中的 2 个连续数字是相同的数字,则它们应通过求和合并为一个(即 [4,4,0,0] - > [8,0,0,0])。
2. 新合并的图块不能与另一个图块合并 在同一回合平铺(示例:[4,4,8,0] -> [8,8,0,0] True,但 [16,0,0,0] False)
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,4,0,0] --> [8,0] 和 [4,4,8,0] ->[8,8,0]?
-
列表的长度应该是 4,所以每当一个动作发生时,如果长度减小,则添加 0..
-
[2,2,2,2] 怎么样? -> [4,2,2,0] 还是 [4,4,0,0]?
-
@Raubsauger 它应该是 [4,4,0,0]
-
只是为了清楚:[4,4,0,2] -> [8,0,2,0] 而不是 [8,2,0,0], [0,0, 2,2] -> [0,4,0,0] 而不是 [4,0,0,0]?