Как подготовить все допустимые вычисления с заданным количеством одинаковых значений в python?

Мне нужно сделать все вычисления с 4 целыми числами, которые идентичны. Например.

def all_math(number,goal):
 "not sure what to put here yet"

>>print(all_math(3, 6)
3+3+3+3
3+3+3-3#<
<p> И так далее.</p> <p> Как я могу перебирать все эти вычисления, пока не достигнет заданного значения (<code>goal параметра)?

2 ответа

Это нужно делать. В случае, если я забуду один вариант, его не составит труда добавить:

import itertools

def all_math(n, goal):
 operators = ["+" , "-", "*", "/"]
 brackets = ["{0}{1}{0}{2}{0}{3}{0}",
 "({0}{1}{0}){2}{0}{3}{0}",
 "{0}{1}{0}{2}({0}{3}{0})",
 "({0}{1}{0}){2}({0}{3}{0})",
 "({0}{1}{0}{2}{0}){3}{0}",
 "({0}{1}({0}{2}{0})){3}{0}",
 "(({0}{1}{0}){2}{0}){3}{0}",
 "{0}{1}({0}{2}{0}{3}{0})",
 "{0}{1}({0}{2}({0}{3}{0}))",
 "{0}{1}(({0}{2}{0}){3}{0})",
 ]
 for combination in itertools.product(operators, repeat=3):
 for bracket in brackets:
 formula = bracket.format(n, *combination)
 try:
 result = eval(formula)
 print formula + " = " + str(result) #for verification
 if result == goal:
 return bracket.format(int(n), *combination) #to output integer
 except ZeroDivisionError:
 print formula + " = Zero Division Error"

print "Result:", all_math(3.0, 6)

Если у кого-то есть хороший алгоритм для скобок, я бы хотел его прочитать. Моя версия немного ручной работы...

Важное примечание. Используйте параметр float как параметр (3.0, а не 3), в противном случае у вас возникают проблемы...


Есть только два принципиально разных способа создания выражения с четырьмя начальными значениями. Вы можете объединить четыре значения в две пары, а затем объединить результаты (всего три операции), или вы можете комбинировать два, затем результат с третьим, а затем результат с последним (также три операции). Есть подсекции последнего в зависимости от того, помещаете ли вы каждое новое "оригинальное" значение слева или справа: ((3/3)/3)/3 не совпадает с 3/(3/(3/3)) или 3/((3/3)/3) или (3/(3/3))/3.

Затем вам нужно определить, какие бинарные операции имеют значение. Вы перечислили сложение, вычитание, умножение, деление. Что еще? Возведение? Другой вид деления (целое число против float)? модуль? math.atan2?

Это достаточно информации для исчерпывающего создания всех возможностей (ну, если вы можете сделать соответствующую комбинаторика). Каждый шаблон имеет только три места в слоте в операторе, поэтому существует 5 * N**3 возможности, где N - количество операторов. Я сомневаюсь, что это глупо огромное количество.

Тем не менее, вам нужно решить, должны ли пар результатов, которые являются "эквивалентными", должны быть включены в результаты или нет. Например, вы хотите отдельно перечислить (3 + 3) * (3 - 3) и (3 - 3) * (3 + 3)? Что относительно ((3 + 3) + 3) + 3) и (3 + 3) + (3 + 3)? Как насчет 3+3+3-3 и 3-3+3+3? Обрезка вывода на этой основе может быть довольно сложной, если это необходимо, это зависит от того, что вы считаете эквивалентным, и это не определено в вопросе.

Вам также необходимо решить, включать или не включать выражения, которые невозможно оценить, например (3 - 3)/(3 - 3). Идентификация их не должна быть сложной - если все остальное не просто оценивает выражение и исключает исключения.

Наконец, вам нужно решить, нужно ли удалять ненужные круглые скобки из вашего вывода в соответствии с правилами ассоциативности включенных операций. Ваш пример вывода 3+3+3+3 предполагает, что вы бы, но ((3/3)+3)-3 предполагает, что вы этого не сделаете.

licensed under cc by-sa 3.0 with attribution.