class Solution:
def scoreOfStudents(self, s: str, answers: List[int]) -> int:
postfix_s = Solution.convert_to_postfix(s)
correct_ans = Solution.evaluate(postfix_s)
memoization_table = dict()
all_results = Solution.all_possible(s, memoization_table)
score = 0
for j in answers:
if j == correct_ans:
score += 5
else:
if j in all_results:
score += 2
return score
#Evaluating the correct answer(Step 1 Converting to Postfix)
def convert_to_postfix(expression):
output = []
stack = []
for char in expression:
if char.isdigit():
output.append(char)
elif char == '*':
while stack and stack[-1] == '*':
output.append(stack.pop())
stack.append(char)
elif char == '+':
while stack:
output.append(stack.pop())
stack.append(char)
while stack:
output.append(stack.pop())
return "".join(output)
#Step 2: Evaluating Postfix
def evaluate(postfix_eval):
stack = []
for i in postfix_eval:
if i.isdigit():
stack.append(int(i))
else:
op2 = stack.pop()
op1 = stack.pop()
if i == '*':
stack.append(op1 * op2)
elif i == '+':
stack.append(op1 + op2)
return stack.pop()
#All Possible Answers with memoization(saves reevaluating)
def all_possible(expr, memoization):
if expr in memoization:
return memoization[expr]
results = set()
if expr.isdigit():
results.add(int(expr))
return results
for i in range(len(expr)):
if expr[i] == "+":
left = Solution.all_possible(expr[:i],memoization)
right = Solution.all_possible(expr[i+1:], memoization)
for l in left:
for r in right:
if l + r <= 1000:
results.add(l + r)
if expr[i] == "*":
left = Solution.all_possible(expr[:i], memoization)
right = Solution.all_possible(expr[i+1:], memoization)
for l in left:
for r in right:
if l * r <= 1000:
results.add(l * r)
memoization[expr] = results
return results