Предположим, у меня есть три целых числа. Я хочу получить список всех возможных значений, полученных путем выполнения всех 16 (4x4 из *, /, +, -
) операций между ними.
Как если бы у меня было 3 4 1
, мы должны получить значения 1, 2, 6, 7, 8, 9, 11, 12, 13, 15 и 16. То есть
res = num1 (op1) num2 (op2) num3
где операторы:
["**", "*/", "*+", "*-", "/*", "//", "/+", "/-", "+*", "+/", "++", "+-", "-*", "-/", "-+", "--"]
Однако, выгода заключается в том, что деление возможно только в том случае, если x%y==0
, т.е. делитель является фактором дивиденды.
Итак, до сих пор мне удавалось перебивать каждую операцию, но я пропускаю некоторые ответы. Я также определил пользовательскую операцию деления для учета улова .
Я должен вернуть список, содержащий уникальные значения, которые являются положительными.
Мой текущий код беспорядок, но здесь это ради этого Здесь также пропущены некоторые значения.
def div(x, y):
if x!=0 and y!=0:
if x%y==0:return x/y
else:return None
ops_lis = ["**", "*/", "*+", "*-", "/*", "//", "/+", "/-", "+*", "+/", "++", "+-", "-*", "-/", "-+", "--"]
d1, d2, d3 = map(int, input().split())
cal_lis, res_lis = [], []
for op in ops_lis:
if op[0] == "*" and op[1] == "*":cal_lis.append(d1*d2*d3)
if op[0] == "*" and op[1] == "/":
if div(d1*d2, d3) != None:cal_lis.append(div(d1*d2, d3))
cal_lis.append(div(d1*d2, d3))
if op[0] == "*" and op[1] == "+":
cal_lis.append(d1*(d2+d3))
cal_lis.append((d1*d2)+d3)
if op[0] == "*" and op[1] == "-":
cal_lis.append(d1*d2-d3)
cal_lis.append(d1*(d2-d3))
cal_lis.append((d1*d3)-d2)
if op[0] == "/" and op[1] == "*":cal_lis.append(div(d1, d2*d3))
if op[0] == "/" and op[1] == "/":
if div(d1, d2) == None or div(d2, d3) == None:
cal_lis.append(None)
else:
cal_lis.append(div(div(d1, d2), d3))
if op[0] == "/" and op[1] == "+":
if div(d1, d2) == None:
cal_lis.append(None)
else:
cal_lis.append(div(d1, d2)+d3)
if op[0] == "/" and op[1] == "-":
if div(d1, d2) == None:
cal_lis.append(None)
else:
cal_lis.append(div(d1, d2)-d3)
if op[0] == "+" and op[1] == "*":
cal_lis.append(d1+d2*d3)
cal_lis.append((d1+d2)*d3)
cal_lis.append((d1+d3)*d2)
if op[0] == "+" and op[1] == "/":
if div(d2, d3) == None:
cal_lis.append(None)
else:
cal_lis.append(d1+div(d2, d3))
if op[0] == "+" and op[1] == "+":cal_lis.append(d1+d2+d3)
if op[0] == "+" and op[1] == "-":cal_lis.append(d1+d2-d3)
if op[0] == "-" and op[1] == "*":
cal_lis.append(d1-d2*d3)
cal_lis.append((d1-d2)*d3)
cal_lis.append((d1-d3)*d2)
if op[0] == "-" and op[1] == "/":
if div(d2, d3) == None:cal_lis.append(None)
else: cal_lis.append(d1-div(d2, d3))
if div(d1-d2, d3) == None:cal_lis.append(None)
else: cal_lis.append(div(d1-d2, d3))
if op[0] == "-" and op[1] == "+":cal_lis.append(d1-d2+d3)
if op[0] == "-" and op[1] == "-":cal_lis.append(d1-d2-d3)
# print(cal_lis)
cal_lis = [int(cal) for cal in cal_lis if cal!=None]
for res in cal_lis:
if (res > 0 and res not in res_lis):
res_lis.append(int(res))
for a in sorted(res_lis):
print(a, end=" ")
print()
Существует ли эффективный способ выполнить эту задачу (возможно, с использованием деревьев?), Учитывая, что условие деления также верно?
Любая помощь будет быть оцененным ...
РЕДАКТИРОВАТЬ: добавлены ограничения
Расчет должен соответствовать следующему формату: число = кости1 op1 кости2 op2 кости3
где:
- op1 и op2 могут быть +, -, * или /. Например, op1 = + и op2 = /
- dice1, dice2 и dice3 могут быть любой комбинацией чисел, брошенных в текущем раунде. Значение ad ie можно использовать один раз в расчете.
- Для деления делитель должен быть фактором деления
- Можно добавить скобки, чтобы переопределить приоритет операторов op1 и op2. т.е. (dice1 op1 dice2) op2 dice3 или dice1 op1 (dice2 op2 dice3)