from itertools import product, chain, permutations
from operator import add, sub, mul, truediv
_OPS = {add: '+', sub: '-', mul: '*', truediv: '/'}
def opcycle(ops):
it = iter(ops)
return lambda a, b: next(it)(a, b)
def countdown(text):
values = map(int, text.split())
values, target = values[:-1], values[-1]
for ops, perm in product(product(*[_OPS] * 5), permutations(values)):
if reduce(opcycle(ops), perm) == target:
return '{0} {6} {1} {7} {2} {8} {3} {9} {4} {10} {5} = {11}'.format(
*chain(perm, (_OPS[op] for op in ops), (target,)))
return None
print countdown('1 3 7 6 8 3 250')
print countdown('25 100 9 7 3 7 881')
print countdown('6 75 3 25 50 100 952')
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QsIGNoYWluLCBwZXJtdXRhdGlvbnMKZnJvbSBvcGVyYXRvciBpbXBvcnQgYWRkLCBzdWIsIG11bCwgdHJ1ZWRpdgoKX09QUyA9IHthZGQ6ICcrJywgc3ViOiAnLScsIG11bDogJyonLCB0cnVlZGl2OiAnLyd9CgpkZWYgb3BjeWNsZShvcHMpOgogICAgaXQgPSBpdGVyKG9wcykKICAgIHJldHVybiBsYW1iZGEgYSwgYjogbmV4dChpdCkoYSwgYikKICAgICAgICAKZGVmIGNvdW50ZG93bih0ZXh0KToKICAgIHZhbHVlcyA9IG1hcChpbnQsIHRleHQuc3BsaXQoKSkKICAgIHZhbHVlcywgdGFyZ2V0ID0gdmFsdWVzWzotMV0sIHZhbHVlc1stMV0KICAgIGZvciBvcHMsIHBlcm0gaW4gcHJvZHVjdChwcm9kdWN0KCpbX09QU10gKiA1KSwgcGVybXV0YXRpb25zKHZhbHVlcykpOgogICAgICAgIGlmIHJlZHVjZShvcGN5Y2xlKG9wcyksIHBlcm0pID09IHRhcmdldDoKICAgICAgICAgICAgcmV0dXJuICd7MH0gezZ9IHsxfSB7N30gezJ9IHs4fSB7M30gezl9IHs0fSB7MTB9IHs1fSA9IHsxMX0nLmZvcm1hdCgKICAgICAgICAgICAgICAgICpjaGFpbihwZXJtLCAoX09QU1tvcF0gZm9yIG9wIGluIG9wcyksICh0YXJnZXQsKSkpCiAgICByZXR1cm4gTm9uZQoKcHJpbnQgY291bnRkb3duKCcxIDMgNyA2IDggMyAyNTAnKQpwcmludCBjb3VudGRvd24oJzI1IDEwMCA5IDcgMyA3IDg4MScpCnByaW50IGNvdW50ZG93bignNiA3NSAzIDI1IDUwIDEwMCA5NTInKQ==