Return neighboring duplicates to Erlang

I am trying to learn recursion in Erlang and I am working on a book. But I click on the wall, faced with the problem of taking the list and returning only duplicate elements. I tried to write a function that returns only unique elements and then removes them from the original list.

adjacent_dups(L) -> L -- uniques(L).

uniques([])    -> [];
uniques([H|T]) -> [H | [X || X <- uniques(T), X /= H]].

However, this will not give the correct result if the list is not structured correctly.

L = [7,3,4,3]

My code will return

adjacent_dups([7,3,4,3]) -> 3 

How can I get

adjacent_dups([7,3,4,3]) -> [] 
+4
source share
2 answers

If you need only neighboring duplicates, you can try a template matching them in pairs from your list. Here is a naive solution to get you started. It is assumed that duplicates occur only in pairs (for example, never three):

adjacent_dups([]) -> [];
adjacent_dups([A,A|Tail]) -> [A|adjacent_dups(Tail)];
adjacent_dups([_Head|Tail]) -> adjacent_dups(Tail).

, , . , , , , . :

adjacent_dups([]) -> [];
adjacent_dups([A,A,A|Tail]) -> adjacent_dups([A,A|Tail]);
adjacent_dups([A,A|Tail]) -> [A|adjacent_dups(Tail)];
adjacent_dups([_Head|Tail]) -> adjacent_dups(Tail).

:

adjacent_dups([1,1,1,1,2,3,4,55,55,6,7,8,8,8,1]).
[1,55,8]
+4

, :

adjacent_dups(L) ->
    adjacent_dups(L, #{}).
adjacent_dups([], Acc) ->
    maps:keys(Acc);
adjacent_dups([H,H|T], Acc) ->
    adjacent_dups(T,maps:put(H,H,Acc));
adjacent_dups([_|T], Acc) ->
    adjacent_dups(T, Acc).

adjacent_dups/1 . , adjacent_dups/2, .

adjacent_dups/1 adjacent_dups/2 . .

adjacent_dups/2 , . ; .

adjacent_dups/2 . . .

adjacent_dups/2 , ; .

+5

Source: https://habr.com/ru/post/1608046/


All Articles