如何以更简单的方式合并列表中的元素?序言

我正在尝试合并列表中的元素,规则如下:

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


以上是如何以更简单的方式合并列表中的元素?序言的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>