Skip to content

Instantly share code, notes, and snippets.

@viniciusd
Last active May 23, 2020 00:29
Show Gist options
  • Save viniciusd/956700f615707e0410345758b152b2dd to your computer and use it in GitHub Desktop.
Save viniciusd/956700f615707e0410345758b152b2dd to your computer and use it in GitHub Desktop.
-module(exercises).
-export([maximum/1,double/1,evens/1, median/1, modes/1]).
maximum([X|Xs]) -> maximum(Xs, X).
maximum([X|Xs], ACC) -> maximum(Xs, max(X, ACC));
maximum([], ACC) -> ACC.
double([X|Xs]) when is_number(X) -> double(Xs, [2*X]).
double([X|Xs], ACC) when is_number(X) -> double(Xs, [2*X|ACC]);
double([], ACC) -> reverse(ACC).
evens(Xs) -> evens(Xs, []).
evens([X|Xs], ACC) when X rem 2 == 0 -> evens(Xs, [X|ACC]);
evens([X|Xs], ACC) when X rem 2 == 1 -> evens(Xs, ACC);
evens([], ACC) -> reverse(ACC).
median([_X|_Xs] = L) ->
OL = lists:sort(L),
Length = length(L),
Middle = Length div 2,
case Length rem 2 of
0 ->
(lists:nth(Middle, OL) + lists:nth(Middle + 1, OL))/2;
1 ->
lists:nth(Middle + 1, OL)
end.
modes(L) ->
extract_numbers(max_frequencies(frequencies(lists:sort(L), 0, []))).
frequencies([X, X|L], OCCUR, ACC) ->
frequencies([X|L], OCCUR+1, ACC);
frequencies([X, Y|L], OCCUR, ACC) ->
frequencies([Y|L], 0, [{X, OCCUR+1}|ACC]);
frequencies([X], OCCUR, ACC) ->
frequencies([], 0, [{X, OCCUR+1}|ACC]);
frequencies([], _OCCUR, ACC) ->
reverse(ACC).
extract_numbers([{X, _}|L]) -> extract_numbers(L, [X]).
extract_numbers([{X, _}|L], ACC) -> extract_numbers(L, [X|ACC]);
extract_numbers([], ACC) -> ACC.
max_frequencies([_X|_Xs] = L) when length(L) >= 1 ->
max_frequencies(
lists:sort(fun ({_, F1}, {_, F2}) -> F1 =< F2 end,
L), []).
max_frequencies([X|L], []) -> max_frequencies(L, [X]);
max_frequencies([{_, F1} = X|L1], [{_, F2}|_L2]) when F1 > F2 -> max_frequencies(L1, [X]);
max_frequencies([{_, F1}|L1], [{_, F2} = Y|L2]) when F1 < F2 -> max_frequencies(L1, [Y|L2]);
max_frequencies([{_, F1}=X|L1], [{_, F2} = Y|L2]) when F1 == F2 -> max_frequencies(L1, [X|[Y|L2]]);
max_frequencies([], L) -> L.
reverse([X|Xs]) -> reverse(Xs, [X]);
reverse([]) -> []).
reverse([X|Xs], ACC) -> reverse(Xs, [X | ACC]);
reverse([], ACC) -> ACC.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment