I am trying to implement a generator function generate_tuples
which yields every possible combination of numbers with a given sum.
Given a size
, elements_sum
so that
generate_tuples(size=3, elements_sum=4)
it would yield these tuples:
(0, 0, 4)
(0, 1, 3)
(0, 2, 2)
(0, 3, 1)
(0, 4, 0)
(1, 0, 3)
(1, 1, 2)
(1, 2, 1)
(1, 3, 0)
(2, 0, 2)
(2, 1, 1)
(2, 2, 0)
(3, 0, 1)
(3, 1, 0)
(4, 0, 0)
For now I ended up with multiple generators for each size
. For instance:
def generate_tuples3(elements_sum: int):
for x in range(elements_sum + 1):
for y in range(elements_sum + 1):
for z in range(elements_sum + 1):
if sum([x, y, z]) != elements_sum:
continue
yield x, y, z
This works, but it's very inefficient and includes a lot of code duplication.