forked from adnanaziz/EPIJudge
-
Notifications
You must be signed in to change notification settings - Fork 0
/
insert_operators_in_string.py
60 lines (52 loc) · 2.12 KB
/
insert_operators_in_string.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import functools
from test_framework import generic_test
def expression_synthesis(digits, target):
def directed_expression_synthesis(digits, current_term):
def evaluate():
intermediate_operands = []
operand_it = iter(operands)
intermediate_operands.append(next(operand_it))
# Evaluates '*' first.
for oper in operators:
if oper == '*':
product = intermediate_operands[-1] * next(operand_it)
intermediate_operands[-1] = product
else: # oper == '+'.
intermediate_operands.append(next(operand_it))
# Evaluates '+' second.
return sum(intermediate_operands)
current_term = current_term * 10 + digits[0]
if len(digits) == 1:
operands.append(current_term)
if evaluate() == target: # Found a match.
return True
del operands[-1]
return False
# No operator.
if directed_expression_synthesis(digits[1:], current_term):
return True
# Tries multiplication operator '*'.
operands.append(current_term)
operators.append('*')
if directed_expression_synthesis(digits[1:], 0):
return True
del operands[-1]
del operators[-1]
# Tries addition operator '+'.
operands.append(current_term)
# First check feasibility of plus operator.
if target - evaluate() <= functools.reduce(lambda val, d: val * 10 + d,
digits[1:], 0):
operators.append('+')
if directed_expression_synthesis(digits[1:], 0):
return True
del operators[-1]
del operands[-1]
return False
operands, operators = [], []
return directed_expression_synthesis(digits, 0)
if __name__ == '__main__':
exit(
generic_test.generic_test_main("insert_operators_in_string.py",
"insert_operators_in_string.tsv",
expression_synthesis))