import collections
import itertools
import sys
import timeit
def filtered_combi(n, r):
def good(combo):
return not any(combo[i]+1 == combo[i+1] for i in range(len(combo)-1))
yield from filter(good, itertools.combinations(range(1, n+1), r))
def non_consecutive_combinator(rnge, r, prev=[]):
if r == 0:
yield prev
else:
for i, item in enumerate(rnge):
for next_comb in non_consecutive_combinator(rnge[i+2:], r-1, prev+[item]):
yield next_comb
def recursive_combi(n, r):
yield from non_consecutive_combinator(range(1, n+1), r)
n0, n1, r0, r1 = map(int, sys.argv[1:])
for n in range(n0, n1):
for r in range(r0, r1):
for f in filtered_combi, recursive_combi:
print(n, r, f.__name__[:4], end=' ')
x = len(list(f(n, r)))
print(x, end=' ')
if x:
t = timeit.timeit(lambda: collections.deque(f(n, r), maxlen=0), number=10000//n) / x
print(t, end=' ')
print()