42 lines
1.2 KiB
Erlang
42 lines
1.2 KiB
Erlang
-module(combinations_permutations).
|
|
|
|
-export([test/0]).
|
|
|
|
perm(N, K) ->
|
|
product(lists:seq(N - K + 1, N)).
|
|
|
|
comb(N, K) ->
|
|
perm(N, K) div product(lists:seq(1, K)).
|
|
|
|
product(List) ->
|
|
lists:foldl(fun(N, Acc) -> N * Acc end, 1, List).
|
|
|
|
test() ->
|
|
io:format("\nA sample of permutations from 1 to 12:\n"),
|
|
[show_perm({N, N div 3}) || N <- lists:seq(1, 12)],
|
|
io:format("\nA sample of combinations from 10 to 60:\n"),
|
|
[show_comb({N, N div 3}) || N <- lists:seq(10, 60, 10)],
|
|
io:format("\nA sample of permutations from 5 to 15000:\n"),
|
|
[show_perm({N, N div 3}) || N <- [5,50,500,1000,5000,15000]],
|
|
io:format("\nA sample of combinations from 100 to 1000:\n"),
|
|
[show_comb({N, N div 3}) || N <- lists:seq(100, 1000, 100)],
|
|
ok.
|
|
|
|
show_perm({N, K}) ->
|
|
show_gen(N, K, "perm", fun perm/2).
|
|
|
|
show_comb({N, K}) ->
|
|
show_gen(N, K, "comb", fun comb/2).
|
|
|
|
show_gen(N, K, StrFun, Fun) ->
|
|
io:format("~s(~p, ~p) = ~s\n",[StrFun, N, K, show_big(Fun(N, K), 40)]).
|
|
|
|
show_big(N, Limit) ->
|
|
StrN = integer_to_list(N),
|
|
case length(StrN) < Limit of
|
|
true ->
|
|
StrN;
|
|
false ->
|
|
{Shown, Hidden} = lists:split(Limit, StrN),
|
|
io_lib:format("~s... (~p more digits)", [Shown, length(Hidden)])
|
|
end.
|