Расставить операторы между числами чтобы получить значение Python
Нужно расставить операторы между num = 99999 - чтобы получить например number = 100. (num,number) могут быть разными. Что я сделал.
import itertools
from itertools import zip_longest
num = 99999
number = 100
mat_zn = '+-*/'
list_mat_zn = list(mat_zn)
list_num = list(str(num))
iter_mat_zn = list(itertools.product(mat_zn, repeat=len(list_num)-1))
res = []
for zn in iter_mat_zn:
res.append(list(zip_longest(list_num,zn)))
Получил res, укорочен.
res = [[('9', '+'), ('9', '+'), ('9', '+'), ('9', '+'), ('9', None)], [('9', '+'), ('9', '+'), ('9', '+'), ('9', '-'), ('9', None)]]
Дальше пока теряюсь. Теперь нужно каждый i из res превратить в формулу. Избавившись от None(это не проблема) Можно через перегрузку операторов в классах, но я там не силен. Еще через operator может быть еще? Какие еще варианты есть более правильные?
Ответы (1 шт):
Автор решения: user207200
→ Ссылка
from itertools import product, chain, zip_longest
N = 99999
tgt = 90
nstr = str(N)
for var in filter(lambda expr: eval(expr) == tgt,
map(lambda ops: ' '.join(chain(*zip_longest(nstr, ops, fillvalue=""))),
product('+-*/', repeat=4))):
print(f'{var}= {tgt}') # -> 9 + 9 + 9 * 9 - 9 = 90 ...
Немного комментариев к коду, не являющемуся образцом читаемости.
В первую очередь сделан упор на использование генераторных выражений (product, map, filter) для ухода от материализации всех промежуточных значений.
Описание самого процесса:
productгенерирует все возможные комбинации арифметических знаков.mapпередает в лямбду каждую комбинацию, где она "сшивается" (zip_longest) со строковым представлением набора чисел (операндов).- В лямбде фильтра происходит выполнение выражения и сравнение с искомым значением.