Как перебрать элементарные арифметические символы
Я хочу проверить, могут ли 7 цифр доходить до 100 при помещении элементарных арифметических символов между ними.
def is_hundred(n1,n2,n3,n4,n5,n6,n7):
p = [+,-,*,/]
for p1 in p:
for p2 in p:
for p3 in p:
for p4 in p:
for p5 in p:
for p6 in p:
if n1 p1 n2 p2 n3 p3 n4 p4 n5 p5 n6 p6 n7 == 100:
return "success"
Как я могу заменить переменные арифметические символы, которые находятся в списке?
2 ответа
Если вы этого не слышали: используя eval
это зло Так что это определенно не тот код, который я бы включил в производство. Тем не менее, это упражнение также является чем-то, что мне, вероятно, никогда не придется развернуть в продукт...
Идея: использовать аргументы и "перебор" всех возможностей добавления операций между ними. Создайте эти параметры в виде строк, и для каждого из них, когда это будет сделано, оцените общее количество (используя eval
) и если общее количество равно 100 - выведите его на стандартный вывод:
def is_hundred(args, res=''):
if res == '':
res = args[0]
args = args[1:]
if not args:
if eval(res) == 100:
print(res)
else:
first = args[0]
for op in ['+','-','*','/']:
is_hundred(args[1:], "{}{}{}".format(res, op, first))
# you can pass any number of arguments in a list: 7, 8, 15...
is_hundred([2,3,4,8,10,11]) # 2+3+4+8*10+11
Вот пример кода, который ищет пару операторов. i
в iadd
означает на месте add
оператор. Вы можете просто переключиться на add
, product
создает дубликат перестановки операторов.
from operator import iadd, isub, imul, itruediv
from itertools import product
operators = (iadd, isub, imul, itruediv)
def is_hundred(values):
n_operators = len(values) - 1
for ops in product(operators, repeat=n_operators):
value = values[0]
for op, v in zip(ops, values[1:]):
value = op(value, v)
if value == 100:
print(list(ops))
return True
else:
return False
print(is_hundred([99,1,1,1,1,1]))
print(is_hundred([1,1,1,1]))