import functools
import itertools
import operator
def groupings(sum_):
if sum_ == 0:
return [()]
else:
return [(i,) + subg for i in range(1, sum_ + 1) for subg in groupings(sum_ - i)]
groupings_with_length = lambda s, l: list(filter(lambda g: len(g) == l, groupings(s)))
def assign_elements(grouping, elements, fold_op=operator.add):
element_gen = iter(elements)
return tuple(functools.reduce(fold_op, itertools.islice(element_gen, g)) for g in grouping)
assign_digits = functools.partial(assign_elements, fold_op=lambda x, y: x*10 + y)
assert list(groupings(4)) == [(1, 1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 3), (2, 1, 1), (2, 2), (3, 1), (4,)]
assert list(groupings_with_length(6, 3)) == [(1, 1, 4), (1, 2, 3), (1, 3, 2), (1, 4, 1), (2, 1, 3), (2, 2, 2), (2, 3, 1), (3, 1, 2), (3, 2, 1), (4, 1, 1)]
assert assign_elements((2, 1, 3, 4), "abcdefghij") == ("ab", "c", "def", "ghij")
assert assign_digits((1, 3, 1, 4), [1,2,3,4,5,6,7,8,9]) == (1, 234, 5, 6789)
##
def evaluate(nums):
A, B, C, D, E, F, G = nums
return ((A - (B/C)) * (D-E) * F) + G
assigned = [assign_digits(g, digits) for g in groupings_with_length(9, 7) for digits in itertools.permutations(range(1, 10))]
print(sorted([(nums, evaluate(nums)) for nums in assigned], key=lambda n_e: n_e[1], reverse=True)[0])
((76, 2, 4, 85, 1, 9, 3), 57081.0)
Fonksiyonlar dursun, bu tur sorularda kullaniriz.