def findexp(target, list, preceeding):
if not list:
if target == 0:
return [preceeding]
else:
return []
else:
head, *tail = list
r = []
r.extend(findexp(target - head, tail, preceeding + [head]))
if preceeding:
r.extend(findexp(target + head, tail, preceeding + [-head]))
*preceeding_init, preceeding_tail = preceeding
blank_append = 10 * preceeding_tail + head
new_target = target + preceeding_tail
r.extend(findexp(new_target - blank_append, tail, preceeding_init + [blank_append]))
return r
items = findexp(100, [1,2,3,4,5,6,7,8,9], [])
#pretty print
print(*map(lambda x: '%s. %s = %s' % (x[1], '+'.join(map(str,x[0])).replace('+-','-'), sum(x[0])), zip(items, range(1,len(items)+1))), sep='\n')
ZGVmIGZpbmRleHAodGFyZ2V0LCBsaXN0LCBwcmVjZWVkaW5nKToKICAgIGlmIG5vdCBsaXN0OgogICAgICAgIGlmIHRhcmdldCA9PSAwOgogICAgICAgICAgICByZXR1cm4gW3ByZWNlZWRpbmddCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICBlbHNlOgogICAgICAgIGhlYWQsICp0YWlsID0gbGlzdAogICAgICAgIHIgPSBbXQogICAgICAgIHIuZXh0ZW5kKGZpbmRleHAodGFyZ2V0IC0gaGVhZCwgdGFpbCwgcHJlY2VlZGluZyArIFtoZWFkXSkpCiAgICAgICAgaWYgcHJlY2VlZGluZzoKICAgICAgICAgICAgci5leHRlbmQoZmluZGV4cCh0YXJnZXQgKyBoZWFkLCB0YWlsLCBwcmVjZWVkaW5nICsgWy1oZWFkXSkpCiAgICAgICAgICAgICpwcmVjZWVkaW5nX2luaXQsIHByZWNlZWRpbmdfdGFpbCA9IHByZWNlZWRpbmcKICAgICAgICAgICAgYmxhbmtfYXBwZW5kID0gMTAgKiBwcmVjZWVkaW5nX3RhaWwgKyBoZWFkCiAgICAgICAgICAgIG5ld190YXJnZXQgPSB0YXJnZXQgKyBwcmVjZWVkaW5nX3RhaWwKICAgICAgICAgICAgci5leHRlbmQoZmluZGV4cChuZXdfdGFyZ2V0IC0gYmxhbmtfYXBwZW5kLCB0YWlsLCBwcmVjZWVkaW5nX2luaXQgKyBbYmxhbmtfYXBwZW5kXSkpCiAgICAgICAgcmV0dXJuIHIKCml0ZW1zID0gZmluZGV4cCgxMDAsIFsxLDIsMyw0LDUsNiw3LDgsOV0sIFtdKQojcHJldHR5IHByaW50CnByaW50KCptYXAobGFtYmRhIHg6ICclcy4gJXMgPSAlcycgICUgKHhbMV0sICcrJy5qb2luKG1hcChzdHIseFswXSkpLnJlcGxhY2UoJystJywnLScpLCBzdW0oeFswXSkpLCB6aXAoaXRlbXMsIHJhbmdlKDEsbGVuKGl0ZW1zKSsxKSkpLCBzZXA9J1xuJyk=