Skip to content

Instantly share code, notes, and snippets.

@denysxftr
Created April 5, 2015 15:09
Show Gist options
  • Save denysxftr/c5d7dd6d77f2d62b522f to your computer and use it in GitHub Desktop.
Save denysxftr/c5d7dd6d77f2d62b522f to your computer and use it in GitHub Desktop.
Find the most frequent element from list.
%% PACK SECTION
pack([X|Unpacked], Packed) :- pack(Unpacked, [[X]], Packed).
pack([H|T], [[H|Acc]|Rest], Packed) :- pack(T, [[H,H|Acc]|Rest], Packed).
pack([X|T], [[Y|Acc]|Rest], Packed) :-
X \= Y,
pack(T, [[X],[Y|Acc]|Rest], Packed).
pack([], RPacked, Packed) :- reverse(RPacked, Packed).
% UTILS SECTION
first([X], X).
first([H | _], H).
last([T], T).
last([_|T], X) :- last(T, X).
wich_bigger(L1,L2,L1) :- length(L1, L1Length), length(L2, L2Length), L1Length > L2Length.
wich_bigger(L1,L2,L2) :- length(L1, L1Length), length(L2, L2Length), L2Length >= L1Length.
find_winner([X], X).
find_winner([H | T], Res) :- find_winner(T, TEMP), wich_bigger(H, TEMP, Res).
perform(L, Times, Winner) :- msort(L, LSorted), pack(LSorted, LPacked), find_winner(LPacked, T), length(T, Times), first(T, Winner).
test(L, T) :- msort(L, LSorted), pack(LSorted, LPacked), find_winner(LPacked, T).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment