Skip to content

Instantly share code, notes, and snippets.

@rlipscombe
Created August 10, 2023 08:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rlipscombe/4a1004057b16d5c596fe9f48381a12d6 to your computer and use it in GitHub Desktop.
Save rlipscombe/4a1004057b16d5c596fe9f48381a12d6 to your computer and use it in GitHub Desktop.
Erlang code to share a list between N
% Share a list between N.
share(List, N) when N > 0 ->
L = (length(List) + N - 1) div N,
lists:reverse(share(List, N, L, [])).
share([], _N = 0, _L, Acc) ->
Acc;
share([], N, L, Acc) ->
share([], N - 1, L, [[] | Acc]);
share(List, N, L, Acc) when L =< length(List) ->
{Take, Rest} = lists:split(L, List),
share(Rest, N - 1, L, [Take | Acc]);
share(List, N, L, Acc) ->
share([], N - 1, L, [List | Acc]).
-ifdef(TEST).
share_test() ->
?assertEqual([[1, 2]], share([1, 2], 1)),
?assertEqual([[1], [2]], share([1, 2], 2)),
?assertEqual([[1], [2], []], share([1, 2], 3)),
?assertEqual([[1], [2], [], []], share([1, 2], 4)),
?assertEqual([[1, 2, 3]], share([1, 2, 3], 1)),
?assertEqual([[1, 2], [3]], share([1, 2, 3], 2)),
?assertEqual([[1], [2], [3]], share([1, 2, 3], 3)),
ok.
-endif.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment