Как перебрать элементарные арифметические символы

Я хочу проверить, могут ли 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]))
Другие вопросы по тегам