8 8 8 8 8 8 8 8 = 1000
Вставлять можно любые знаки, скобки, а также объединять цифры.
import re import itertools ONE_NUMBER_IN_BRACKETS = r'\(\d*\)' USELESS_BRACKETS = r'(\+|\-)\(.*?\)(\+|\-)' if __name__ == '__main__': numbers = [8] * 8 expr = '%s'.join([str(number) for number in numbers]) possible_symbols = ['+', '-', '*', '/', '', '+(', '-(', '*(', '/(', ')+', ')-', ')*', ')/', '(', ')'] result = 1000 count = 0 for item in itertools.product(possible_symbols, repeat=len(numbers)-1): full_expression = expr % item try: if re.search(ONE_NUMBER_IN_BRACKETS, full_expression): continue if re.search(USELESS_BRACKETS, full_expression): continue if eval(full_expression) == result: print '%s=%s' % (full_expression, result) count += 1 except KeyboardInterrupt: break except: pass print 'Checked %s combinations.' % (count,)
Но, есть одна штука, повторяются, например, такие вот варианты:
8+8+8+88+888=1000
8+8+8+888+88=1000
8+8+88+8+888=1000
8+8+88+888+8=1000
8+8+888+8+88=1000
8+8+888+88+8=1000
8+88+8+8+888=1000
8+88+8+888+8=1000
Думал, может быть, другую функцию из itertools использовать, но, увы, другие не дают и половины верных ответов, да и не логично тут другие вроде бы… Вот главный вопрос - как избавится от таких повторений с перестановкой слагаемых?
п.с. и ещё одно - как сделать, чтобы были видны здесь пустые строки в коде? а то форум их “хавает”