Я решил это, рассматривая только самый низкий возраст для первой позиции и второй самый низкий возраст для второй позиции. Таким образом, поиск дубликатов не требуется.
ages = list(range(1,13))
kids_ages = []
# First, pick the smallest age
for age1 in range(1,13):
remaining_sum = 13 - age1
# Pick the next smallest age
for age2 in range(age1 + 1, 13):
age3 = 13 - age1 - age2
if age3 > age1 and age3 > age2:
kids_ages.append( (age1, age2, age3) )
print kids_ages
# Result:
# [(1, 2, 10), (1, 3, 9), (1, 4, 8), (1, 5, 7), (2, 3, 8), (2, 4, 7), (2, 5, 6), (3, 4, 6)]
РЕДАКТИРОВАТЬ: Решение выше не включает варианты, где число повторяется, например (1, 1, 11). Чтобы включить их, просто измените одно место в коде, чтобы получить:
kids_ages = []
# First, pick the smallest age
for age1 in range(1,13):
remaining_sum = 13 - age1
# Pick the next smallest age, whch may be the same as the first
for age2 in range(age1, 13):
# Only a single number can be the third age. Check if it's valid.
age3 = 13 - age1 - age2
if age3 >= age2:
kids_ages.append( (age1, age2, age3) )
# Result:
# [(1, 1, 11), (1, 2, 10), (1, 3, 9), (1, 4, 8), (1, 5, 7), (1, 6, 6), (2, 2, 9), (2, 3, 8), (2, 4, 7), (2, 5, 6), (3, 3, 7), (3, 4, 6), (3, 5, 5), (4, 4, 5)]
Для трех одинаковых чисел не существует такого решения, которое бы суммировалось в 13.