39 lines
1.1 KiB
Plaintext
39 lines
1.1 KiB
Plaintext
% generate the size-M combinations from 0 to n-1
|
|
combinations = iter (m, n: int) yields (sequence[int])
|
|
if m<=n then
|
|
state: array[int] := array[int]$predict(1, m)
|
|
for i: int in int$from_to(0, m-1) do
|
|
array[int]$addh(state, i)
|
|
end
|
|
|
|
i: int := m
|
|
while i>0 do
|
|
yield (sequence[int]$a2s(state))
|
|
i := m
|
|
while i>0 do
|
|
state[i] := state[i] + 1
|
|
for j: int in int$from_to(i,m-1) do
|
|
state[j+1] := state[j] + 1
|
|
end
|
|
if state[i] < n-(m-i) then break end
|
|
i := i - 1
|
|
end
|
|
end
|
|
end
|
|
end combinations
|
|
|
|
% print a combination
|
|
print_comb = proc (s: stream, comb: sequence[int])
|
|
for i: int in sequence[int]$elements(comb) do
|
|
stream$puts(s, int$unparse(i) || " ")
|
|
end
|
|
end print_comb
|
|
|
|
start_up = proc ()
|
|
po: stream := stream$primary_output()
|
|
for comb: sequence[int] in combinations(3, 5) do
|
|
print_comb(po, comb)
|
|
stream$putl(po, "")
|
|
end
|
|
end start_up
|